`
thinkincoder
  • 浏览: 12691 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类

jvm运行时的数据区域

阅读更多

   根据Java虚拟机的规范,Java虚拟机所管理的内存将包括以下几个运行时数据区域,但是JVM实现的时候可能会将某些区域合并、共用。

 

1、程序计数器(Program Counter Register)
    程序计数器是一块较小的内存空间,它的作用可以看成是当前线程所执行的字节码的行号指示器。每个线程都会有一个独立的程序计数器(线程私有,互不影响)来记录正在执行的虚拟机字节码指令地址,如果是Native方法,这个计数器值则为空(Undefined)。此内存区域是唯一一个在Java虚拟机规范中没有规定任何OutOfMemoryError情况的区域。
2、Java虚拟机栈(Java Virtual Machine Stack)
    与程序计数器一样,Java虚拟机栈也是线程私有的,它的生命周期与线程相同。虚拟机栈描述的是Java方法执行的内存模型:每个方法被执行的时候都会同时创建一个栈帧(Stack Frame)用于存储局部变量表、操作数栈、动态链表、方法出口等信息。每一个方法被调用直至执行完成的过程,就对应着一个栈帧在虚拟机栈中从入栈到出栈的过程。
    通常将JVM的内存区域粗略的分为堆和栈,这里所指的栈就是Java虚拟机栈。
    局部变量表存放了编译期可知的各种基本数据类型(boolean、byte、char、short、int、float、long、double)、对象引用和returnAddress(指向了一条字节码指令的地址)。
    其中64位的long和double类型的数据会占用2个局部变量空间,其他的数据类型只占用1个。局部变量表所需的内存空间会在编译期完成分配,当方法运行期间不会改变局部变量表的大小。
    Java虚拟机规范中,如果线程请求的栈深度大于虚拟机所允许的深度,将抛出StackOverflowError异常;如果虚拟机栈可以动态扩展,当扩展时无法申请到足够的内存时会抛出 StackOverflowError异常。
3、本地方法栈(Native Method Stacks)
    本地方法栈与虚拟机栈的作用非常相似,只不过虚拟机栈为虚拟机执行Java方法服务,而本地方法栈是为虚拟机使用的Native方法服务。不同的虚拟机对本地方法栈实现方式不同,其中Sun HotSpot虚拟机将本地方法栈和虚拟方法栈合二为一。本地方法栈也会抛出StackOverflowError和StackOverflowError异常。
4、Java堆(Java Heap)
    Java堆是Java虚拟机管理的内存中最大的一块,Java堆是被所有线程共享的一块内存区域。Java虚拟机规范中描述:所有的对象实例以及数组都要在堆上分配。
    Java堆是垃圾收集器管理的主要区域,也被称为GC堆。从内存回收的角度看可以细分为:新生代和老年代;新生代可分为Eden空间、From Survivor空间、To Survivor空间。从内存分配角度看,线程共享的Java堆可能划分出多个线程私有的分配缓冲区(Thread Local Allocation Buffer,TLAB)。    
    如果堆中没有内存完成实例分配,并且堆也无法再扩展的时候,就会抛出OutOfMemoryError异常。
5、方法区(Method Area)
    方法区是所有线程共享的内存区域,它用于存储已被虚拟机加载的类信息、常量、静态变量、即使编译器编译后的代码等数据。虽然Java虚拟机规范把方法区描述为堆的一部分,但是它有一个别名-NonHeap(非堆),目的是与Java堆区分开。
    HotSpot虚拟机上,很多人将方法区描述为永久代(Permanent Generation),本质上两者并不等价,或者说使用永久代来实现了方法区。
    垃圾收集行为在这个区域是比较少出现的,这个区域的内存回收主要目标是针对常量池的回收和对类型的卸载。当方法区的内存无法满足内存分配需求时,将抛出OutOfMemoryError异常。
6、运行时常量池(Runtime Constant Pool)
    运行时常量池是方法区的一部分。Class文件中除了有类的版本、字段、方法、接口等描述信息外,还有一项是常量池,用于存放编译期生成的各种字面量和符号引用,这部分内容将在类加载后存放到方法区的运行时常量池。
    运行期常量池是方法区的一部分,所以也会受到方法区内存的限制,当常量池无法再申请到内存时会抛出OutOfMemoryError异常。
7、直接内存(Direct Memory)
    直接内存并不是虚拟机运行时的数据区域,但是这部分内存也会被频繁使用,而且也有可能导致OutOfMemoryError异常。
    NIO中引入了一种基于通道(Channel)与缓冲区(Buffer)的IO方式,它可以使用Native函数库直接分配堆外内存,然后通过Java堆中的DirectByteBuffer对象作为这块内存的引用进行操作。
    直接内存不受Java堆大小的限制,但是会受本机总内存的限制。如果各个区域的内存总和大于物理内存,那么会导致动态扩展时出现OutOfMemoryError异常。
  • 大小: 103.3 KB
分享到:
评论

相关推荐

    JVM 运行时数据区域,垃圾回收机制,类加载机制三大功能详解.docx

    ### JVM 运行时数据区域、垃圾回收机制与类加载机制详解 #### 一、运行时数据区域 Java虚拟机(JVM)的核心组件之一便是其运行时数据区域,这一区域负责存储程序运行过程中产生的各种数据。为了更好地理解这部分内容...

    运行时数据区域

    本文将围绕JVM运行时数据区域进行详细介绍,包括程序计数器、Java虚拟机栈、本地方法栈、方法区以及Java堆等组成部分。 #### 二、程序计数器 **定义**:程序计数器是一块较小的内存空间,它可以被视为当前线程所...

    JVM运行时数据区

    ### JVM运行时数据区详解 #### 一、概述 Java虚拟机(JVM)作为Java程序的运行环境,定义了一系列用于程序执行过程中使用的数据区域。这些数据区域在JVM启动时创建,在JVM退出时销毁。其中一些数据区域是线程独立...

    JVM内存分配与垃圾回收详解

    本文对 JVM 内存分配与垃圾回收进行了详细的解释,包括 JVM 运行时数据区域、String 常量池、垃圾回收、垃圾收集算法等内容。了解 JVM 内存分配与垃圾回收是 Java 开发者必须掌握的基础知识之一。

    hllvm.借HSDB来探索HotSpot VM的运行时数据1

    【标题】:“深入理解Java内存模型:从JVM运行时数据区域分析t1、t2、t3的位置” 【描述】:本篇文章旨在探讨Java内存模型中不同类型的变量——包括静态变量t1、实例变量t2和局部变量t3——在HotSpot VM中的存储...

    日常总结java + 大数据.zip

    日常总结java + 大数据每日摘要目录通用常备Redis 常问Java 语言Java 类加载器Java 并发知识Java 并发包基石-AQS详解JVM 知识JVM 运行时数据区域JVM 垃圾回收JVM 内存溢出异常测试Java 新特性Java串行接口算法相关...

    jvm内存的运作

    #### 二、JVM运行时数据区域详解 JVM在执行Java程序的过程中,会使用多种不同的数据区域,每种区域都有其特定的用途、创建和销毁的时间。根据《Java虚拟机规范(第二版)》的规定,JVM主要包含以下几种运行时数据...

    jvm内存溢出

    #### 二、JVM运行时数据区域 - **程序计数器(Program Counter Register)**:当前线程所执行的字节码的行号指示器。每条线程拥有独立的程序计数器,因此它属于线程私有区域。不会发生内存溢出。 - **Java虚拟机栈...

    Java内存模型与JVM运行时数据区的区别详解

    Java内存模型与JVM运行时数据区的区别详解 Java内存模型是Java语言在多线程并发情况下对于共享变量读写的规范,主要是为了解决多线程可见性、原子性的问题,解决共享变量的多线程操作冲突问题。Java内存模型是为了...

    JVM的运行机制

    - JVM允许在运行时动态加载类和资源,适应不同环境的需求。 总结来说,JVM的运行机制是Java平台无关性的关键,它通过字节码和解释器实现了代码的跨平台执行,同时通过垃圾回收和内存管理提供了高效且安全的运行...

    JVM 32 道面试题及答案.docx

    JVM 运行时数据区域 JVM 在执行 Java 程序的过程中会把它所管理的内存划分为若干不同的数据区,这些区域有各自的用途、创建和销毁时间。 程序计数器是一块较小的内存空间,可以看作当前线程所执行字节码的行号...

    JVM运行时数据区原理解析

    JVM运行时数据区是Java虚拟机中最重要的组成部分之一,它是JVM运行时的核心区域,负责存储和管理程序运行时需要的数据。根据JVM规范,JVM运行时数据区可以分为五个部分:PC寄存器、虚拟机栈、方法区、运行时常量池和...

    全面了解JVM组成底层工作原理以及数据结构

    此外,直接内存不属于JVM运行时数据区的一部分,但被频繁使用,如在Java NIO中用于基于Channel与Buffer的IO操作。 3. JVM执行引擎与垃圾回收: JVM的执行引擎负责解释字节码指令,它通常包括即时编译器和解释器两种...

    JVM运行时数据区划分原理详解

    "JVM运行时数据区划分原理详解" JVM运行时数据区划分原理详解是Java虚拟机(JVM)的核心组件之一,负责管理Java应用程序的内存资源。该原理详解了JVM如何划分和管理内存空间,以便更好地支持Java应用程序的运行。 ...

    深入JVM内核—原理、诊断与优化视频教程-2.JVM运行机制

    【JVM运行机制详解】 Java虚拟机(JVM)是Java平台的核心组成部分,它负责执行字节码,为Java程序提供跨平台的运行环境。在深入理解JVM内核的运行机制时,我们需要关注以下几个关键点: 1. **类加载机制**:JVM...

    解析JVM内存结构和6大区域

    JVM 的内存结构可以分为 6 个区域:PC 寄存器、JVM 栈、堆(Heap)、方法区、运行时常量池和直接内存。每个区域都有其特定的功能和作用,以下是对每个区域的详细介绍: PC 寄存器(PC Register) PC 寄存器是一块...

    java图片理解

    8. JVM运行时数据区域: Java虚拟机(JVM)有多个运行时数据区域,包括程序计数器、虚拟机栈、本地方法栈、堆、方法区(在Java 8后被元空间取代)和直接内存。这些区域各自负责不同的任务,如存储方法调用信息、对象...

    03 运行时数据区概述及线程.pptx

    03 JVM 运行时数据区概述及线程的 PPT 重绘。讲述 Java 虚拟机 运行时数据区所处位置,结构划分,以及各个区域与线程的关系。

    java虚拟机运行时数据区分析

    JVM的运行时数据区是指JVM在运行时使用的一些区域,用于存储被JVM自身或者在JVM上运行的程序所使用的数据。这些区域包括: 1. 方法区(Method Area):用于存储类信息、字段信息和方法信息的区域。 2. 堆(Heap):...

Global site tag (gtag.js) - Google Analytics