虚拟机运行时数据区大致分为5个区域:
1.方法区;
2.栈
3.堆
4.本地方法栈;
5.程序计数器;
一、程序计数器
程序计数器(Program Counter Register)是一块较小的内存空间,它的作用可以看做是当前线程所执行的字节码的行号指示器。由于Java 虚拟机的多线程是通过线程轮流切换并分配处理器执行时间的方式来实现的,在任何一个确定的时刻,一个处理器(对于多核处理器来说是一个内核)只会执行一条线程中的指令。因此,为了线程切换后能恢复到正确的执行位置,每条线程都需要有一个独立的程序计数器,各条线程之间的计数器互不影响,独立存储,我们称这类内存区域为“线程私有”的内存。
如果线程正在执行的是一个Java 方法,这个计数器记录的是正在执行的虚拟机字节码指令的地址;如果正在执行的是Natvie 方法,这个计数器值则为空(Undefined)。此内存区域是唯一一个在Java 虚拟机规范中没有规定任何OutOfMemoryError 情况的区域。
二、栈
与程序计数器一样,Java 虚拟机栈(Java Virtual Machine Stacks)也是线程私有的,它的生命周期与线程相同。虚拟机栈描述的是Java 方法执行的内存模型:每个方法被执行的时候都会同时创建一个栈帧(Stack Frame)用于存储局部变量表、操作栈、动态链接、方法出口等信息。每一个方法被调用直至执行完成的过程,就对应着一个栈帧在虚拟机栈中从入栈到出栈的过程。
三、本地方法栈
本地方法栈(Native Method Stacks)与虚拟机栈所发挥的作用是非常相似的,其区别不过是虚拟机栈为虚拟机执行Java 方法(也就是字节码)服务,而本地方法栈则是为虚拟机使用到的Native 方法服务
四、堆
对于大多数应用来说,Java 堆(Java Heap)是Java 虚拟机所管理的内存中最大的一块。Java 堆是被所有线程共享的一块内存区域,在虚拟机启动时创建。此内存区域的唯一目的就是存放对象实例,几乎所有的对象实例都在这里分配内存。这一点在Java 虚拟机规范中的描述是:所有的对象实例以及数组都要在堆上分配,Java 堆是垃圾收集器管理的主要区域,因此很多时候也被称做“GC 堆”如果从内存回收的角度看,由于现在收集器基本都是采用的分代收集算法,所以Java
堆中还可以细分为:新生代和老年代;根据Java 虚拟机规范的规定,Java 堆可以处于物理上不连续的内存空间中,只要
逻辑上是连续的即可,就像我们的磁盘空间一样。在实现时,既可以实现成固定大小的,也可以是可扩展的,不过当前主流的虚拟机都是按照可扩展来实现的(通过-Xmx和-Xms 控制)。如果在堆中没有内存完成实例分配,并且堆也无法再扩展时,将会抛出OutOfMemoryError 异常。
五、 方法区
方法区(Method Area)与Java 堆一样,是各个线程共享的内存区域,它用于存储已被虚拟机加载的类信息、常量、静态变量、即时编译器编译后的代码等数据。虽然Java 虚拟机规范把方法区描述为堆的一个逻辑部分,但是它却有一个别名叫做Non-Heap(非堆),目的应该是与Java 堆区分开来对于习惯在HotSpot 虚拟机上开发和部署程序的开发者来说,很多人愿意把方法区称为“永久代”(Permanent Generation)
六、运行时常量池
运行时常量池(Runtime Constant Pool)是方法区的一部分。Class 文件中除了有类的版本、字段、方法、接口等描述等信息外,还有一项信息是常量池(Constant PoolTable),用于存放编译期生成的各种字面量和符号引用,这部分内容将在类加载后存放到方法区的运行时常量池中。
分享到:
相关推荐
"JVM运行时数据区划分原理详解" JVM运行时数据区划分原理详解是Java虚拟机(JVM)的核心组件之一,负责管理Java应用程序的内存资源。该原理详解了JVM如何划分和管理内存空间,以便更好地支持Java应用程序的运行。 ...
JVM运行时数据区是Java虚拟机在运行时对该Java进程占用的内存进行的一种逻辑上的划分,包括方法区、堆内存、虚拟机栈、本地方法栈、程序计数器。这些区块实际都是Java进程在Java虚拟机的运作下通过不同数据结构来对...
### JVM 运行时数据区域、垃圾回收机制与类加载机制详解 #### 一、运行时数据区域 Java虚拟机(JVM)的核心组件之一便是其运行时数据区域,这一区域负责存储程序运行过程中产生的各种数据。为了更好地理解这部分内容...
03 JVM 运行时数据区概述及线程的 PPT 重绘。讲述 Java 虚拟机 运行时数据区所处位置,结构划分,以及各个区域与线程的关系。
【JVM运行机制详解】 Java虚拟机(JVM)是Java平台的核心组成部分,它负责执行字节码,为Java程序提供跨平台的运行环境。在深入理解JVM内核的运行机制时,我们需要关注以下几个关键点: 1. **类加载机制**:JVM...
### JVM运行时数据区 #### 程序计数器 程序计数器是当前线程所执行的字节码的行号指示器,是线程私有的内存区域。由于Java是多线程并发执行的,每个线程都需要有一个独立的程序计数器,以便记录线程切换后继续执行...
冯立全在分享中重点介绍了JVM运行机制,尤其强调了运行时数据区域的布局、Class文件的结构、字节码技术、类加载机制以及垃圾回收算法等核心内容。 运行时数据区域是JVM内存模型的核心,它被划分为若干部分,主要...
在JDK 8之前,方法区是在堆中划分出来的一部分内存区域;而在JDK 8之后,方法区被移到了本地内存中,被称为元空间(Metaspace)。 - **变化**:JDK 8之后,方法区从堆中分离,变为元空间。 - **存储位置**:元空间...
3. 运行时数据区:JVM在执行Java程序的过程中,会将其划分成不同的区域以管理不同的数据。主要包括方法区(Method Area)、堆(Heap)、Java栈(Java Stack)、本地方法栈(Native Method Stack)、程序计数器...
#### 三、JVM运行时数据区详解 ##### 3.1 PC寄存器 PC寄存器(Program Counter Register)用于存储当前线程下一条指令的位置。对于执行native方法的线程,PC寄存器内容为空。 ##### 3.2 JVM栈 JVM栈是线程私有的...
HotSpot VM是Oracle JDK中默认的JVM实现,它提供了一种称为HSDB(HotSpot Debugger Bridge)的工具,用于在运行时查看和分析JVM内部的数据。本篇将通过HSDB的使用案例来探讨HotSpot VM的运行时数据。 首先,我们...
直接内存并不属于JVM运行时数据区的一部分,而是由JDK NIO库直接分配的堆外内存。这部分内存不受JVM堆大小的限制,但同样可能导致内存溢出。DirectByteBuffer对象作为直接内存的引用,用于操作这块内存。 #### 三、...
2. 运行时数据区:JVM内存被划分为多个区域,包括堆、栈、方法区、程序计数器和本地方法栈。其中,堆存储对象实例,栈保存方法调用的局部变量,方法区存储类信息,程序计数器记录下一条指令地址,本地方法栈为JNI...
JVM性能调优_JVM内存区域划分 JVM(Java Virtual Machine)是 Java 语言的核心组件之一,其性能优化对 Java 应用程序的执行效率和稳定性具有至关重要的影响。在 JVM 中,内存区域的划分和管理是性能优化的关键所在...
#### 二、JVM运行时数据区 JVM在运行时会划分多个内存区域来管理数据,主要包括以下几个部分: - **方法区**:存储类的信息(包括类的方法和字段)、常量、静态变量等。 - **堆区**:用于存放所有类实例和数组对象...
运行时数据区是Java虚拟机(JVM)的重要组成部分,它负责管理程序在执行过程中的数据。这个区域被划分为几个不同的部分,每个部分都有其特定的功能和生命周期。以下是运行时数据区的主要组件: 1. **程序计数器...
### JVM 详细介绍:掌握 JVM 的各个组成部分与功能 #### 一、Java 源文件编译及执行 Java 应用程序的核心...理解 JVM 的内部工作原理有助于开发者更好地编写高质量的 Java 应用程序,并有效解决运行时遇到的问题。
JVM内存区域划分是Java虚拟机(JVM)中的一种内存管理机制,主要分为五个部分:程序计数器、Java栈、本地方法栈、堆和方法区。这些区域各自扮演着不同的角色,共同组成了JVM的内存管理系统。 程序计数器 程序...
4. **方法区(Method Area)**:又称非堆(Non-Heap),存储类结构信息、运行时常量池、字段、方法代码等元数据。在Oracle JDK 8之前,这个区域被称为永久代,之后被元数据区(Metaspace)取代。 5. **运行时常量池...