翻译人员: 铁锚
翻译时间: 2013年11月11日
原文链接: JVM Run-Time Data Areas
参考地址: JVM运行时是什么样子?
这是阅读JVM规范时的笔记, 我画了一幅图来帮助自己加深理解:
1. 单线程数据区(非共享)
从上图可以看出,每个线程都有自己独立的数据区,包括 PC(程序计数器),JVM(方法)栈,以及本地方法栈. 当创建新线程时,这些数据区域将会一并创建.
程序计数器: 英文名字是 Program Counter Register,简称PC, 用于记录每个线程执行到哪个地方了(可以认为程序是指令的序列,PC记录着下一条(或本条)应该执行的指令的地址).
JVM方法栈: 包含如下面的图所示的一些栈帧(frame).
本地方法栈: 英文为 Native Method Stack,顾名思义,适用于供 native方法使用的内存空间,本地方法(native method)指不用Java语言开发的方法,如 C,C++,PB等编译型语言所开发的动态链接库(中的方法).
2. 所有线程共享数据区
堆内存 和 方法区 是所有线程共享的数据区.
堆内存: 英文名称 Heap,是Java编程最频繁使用的内存区域. 其中存储着 数组和对象,当 JVM启动时即创建此内存区域, 垃圾回收主要是指堆内存的回收。
方法区: Method Area,存储了 运行时常量池,类结构信息(field and method data) 以及 方法,构造器的代码.
运行时常量池: Runtime Constant Pool, 每一个类或者接口,在其编译后生成的 .class文件中,有一个部分叫做 常量表(constant_pool_table),JVM将class文件加载以后,就解析常量表的内容到运行时常量池. 包括编译时方法中就明确可知的数字值,String值, 以及必须在运行时解析的属性域引用(field reference).
JVM栈(Stack)由一个个的 栈帧(Frame)组成,当一个方法被调用时会自动压入一个栈帧到Stack中. 每个栈帧(frame)由局部变量区,操作数栈,以及对常量(池)的引用组成.
想要了解更详细的信息,建议访问: JVM官方文档.
相关文章:
相关推荐
第3节: 揭秘JVM运行时数据区-02第3节: 揭秘JVM运行时数据区-02第3节: 揭秘JVM运行时数据区-02第3节: 揭秘JVM运行时数据区-02第3节: 揭秘JVM运行时数据区-02第3节: 揭秘JVM运行时数据区-02第3节: 揭秘JVM运行...
### JVM运行时数据区详解 #### 一、概述 Java虚拟机(JVM)作为Java程序的运行环境,定义了一系列用于程序执行过程中使用的数据区域。这些数据区域在JVM启动时创建,在JVM退出时销毁。其中一些数据区域是线程独立...
Java内存模型与JVM运行时数据区的区别详解 Java内存模型是Java语言在多线程并发情况下对于共享变量读写的规范,主要是为了解决多线程可见性、原子性的问题,解决共享变量的多线程操作冲突问题。Java内存模型是为了...
JVM运行时数据区原理解析 JVM运行时数据区是Java虚拟机中最重要的组成部分之一,它是JVM运行时的核心区域,负责存储和管理程序运行时需要的数据。根据JVM规范,JVM运行时数据区可以分为五个部分:PC寄存器、虚拟机...
"JVM运行时数据区划分原理详解" JVM运行时数据区划分原理详解是Java虚拟机(JVM)的核心组件之一,负责管理Java应用程序的内存资源。该原理详解了JVM如何划分和管理内存空间,以便更好地支持Java应用程序的运行。 ...
首先,我们来看JVM运行时数据区的组成部分: 1. **方法区(Method Area)**:这是一个全局共享的内存区域,存储了类信息、常量、静态变量以及编译后的代码。这部分内存被称为Non-Heap,当其内存不足时,会抛出`...
此外,直接内存不属于JVM运行时数据区的一部分,但被频繁使用,如在Java NIO中用于基于Channel与Buffer的IO操作。 3. JVM执行引擎与垃圾回收: JVM的执行引擎负责解释字节码指令,它通常包括即时编译器和解释器两种...
03 JVM 运行时数据区概述及线程的 PPT 重绘。讲述 Java 虚拟机 运行时数据区所处位置,结构划分,以及各个区域与线程的关系。
### JVM运行时数据区 #### 程序计数器 程序计数器是当前线程所执行的字节码的行号指示器,是线程私有的内存区域。由于Java是多线程并发执行的,每个线程都需要有一个独立的程序计数器,以便记录线程切换后继续执行...
5. **JVM运行时数据区详解**: - 程序计数器:每个线程都有自己的计数器,用于记录当前线程正在执行的字节码指令位置。 - 虚拟机栈:存储每个方法的局部变量表、操作数栈、动态链接和方法出口等信息,每个方法调用...
直接内存并不属于JVM运行时数据区的一部分,而是由JDK NIO库直接分配的堆外内存。这部分内存不受JVM堆大小的限制,但同样可能导致内存溢出。DirectByteBuffer对象作为直接内存的引用,用于操作这块内存。 #### 三、...
#### 三、JVM运行时数据区详解 ##### 3.1 PC寄存器 PC寄存器(Program Counter Register)用于存储当前线程下一条指令的位置。对于执行native方法的线程,PC寄存器内容为空。 ##### 3.2 JVM栈 JVM栈是线程私有的...
#### 二、JVM运行时数据区 JVM在运行时会划分多个内存区域来管理数据,主要包括以下几个部分: - **方法区**:存储类的信息(包括类的方法和字段)、常量、静态变量等。 - **堆区**:用于存放所有类实例和数组对象...
6. 直接内存(Direct Memory):并非JVM运行时数据区的一部分,它通过NIO类库支持直接操作本地内存,并不是JVM规范所定义的。 JVM内存模型的设计是为了支持Java程序的动态特性,同时保证内存的安全和高效利用。JVM...
以下是对JVM运行时数据区及其相关知识点的详细说明: 1. **运行时数据区**: - **程序计数器**:每个线程都有自己的程序计数器,用于存储当前线程执行的字节码的行号,是唯一没有规定内存溢出情况的区域。 - **...
5. **JVM运行时数据区详解**: - 程序计数器:记录当前线程执行的字节码指令位置,用于控制程序流程。 - 虚拟机栈:每个方法对应一个栈帧,存储局部变量表、操作数栈、动态链接和方法返回地址等信息。 - 本地方法...
#### JVM运行时数据区 **5. JVM运行时数据区详解** JVM管理的内存主要分为以下几部分: - **程序计数器(Program Counter Register)**:记录当前线程所执行的字节码指令的位置,确保线程恢复执行时可以从正确的...
#### 二、JVM运行时数据区 ##### 2.1 堆区 堆是所有线程共享的一块内存区域,在虚拟机启动时创建。主要用于存放对象实例和数组。 - **新生代**:主要存放新创建的对象。 - **老年代**:经过多次GC后存活的对象会被...