JVM内存结构关键部分概述 -- 知识铺
JVM内存结构由几个关键部分组成
每个部分都有其特定的内容和作用。以下是每个部分的具体内容:
-
程序计数器(Program Counter Register)
- 存储当前线程执行的字节码指令的行号。
- 用于实现线程的上下文切换。
-
虚拟机栈(JVM Stacks)
- 每个线程私有。
- 存储方法调用时的局部变量和部分结果。
- 包含栈帧(Stack Frame),每个栈帧包括:
- 局部变量表:存储基本数据类型和对象引用。
- 操作数栈:用于执行字节码指令时的临时数据存储。
- 动态连接信息:用于方法调用过程中的动态链接。
- 方法返回地址:记录方法执行完毕后的返回位置。
-
本地方法栈(Native Method Stacks)
- 类似于虚拟机栈,但用于本地方法(如JNI方法)的执行。
-
Java堆(Java Heap)
- 所有线程共享。
- 存放对象实例和数组。
- 包含:
- 对象实例:由new关键字创建的对象。
- 类初始化生成的对象。
- 字符串常量池:从JDK 7开始迁移到堆中。
- 静态变量:从JDK 7开始迁移到堆中。
-
方法区(Method Area)
- 存储已被加载的类信息、常量、静态变量等。
- 包含:
- 类型信息:类的名称、父类、修饰符、接口等。
- 域(Field)信息:字段的名称、类型、修饰符等。
- 方法(Method)信息:方法的名称、返回类型、参数、修饰符、字节码等。
- 静态变量:非final的静态变量。
- 运行时常量池(Runtime Constant Pool):存放编译期和运行期的常量。
-
直接内存(Direct Memory)
- 非JVM标准内存,用于NIO操作。
- 直接在堆外分配内存,通过DirectByteBuffer对象引用。
- 可以提高IO性能,但不受GC管理。
-
线程分配缓冲区(Thread Local Allocation Buffer, TLAB)
- 线程私有,用于提升对象分配效率。
- 位于Java堆中,但每个线程有自己的缓冲区。
这些组成部分共同构成了JVM的内存结构,它们各自承担着不同的角色,确保Java程序能够高效、安全地运行。
- 原文作者:知识铺
- 原文链接:https://index.zshipu.com/geek001/post/20240710/JVM%E5%86%85%E5%AD%98%E7%BB%93%E6%9E%84%E5%85%B3%E9%94%AE%E9%83%A8%E5%88%86%E6%A6%82%E8%BF%B0--%E7%9F%A5%E8%AF%86%E9%93%BA/
- 版权声明:本作品采用知识共享署名-非商业性使用-禁止演绎 4.0 国际许可协议进行许可,非商业转载请注明出处(作者,原文链接),商业转载请联系作者获得授权。
- 免责声明:本页面内容均来源于站内编辑发布,部分信息来源互联网,并不意味着本站赞同其观点或者证实其内容的真实性,如涉及版权等问题,请立即联系客服进行更改或删除,保证您的合法权益。转载请注明来源,欢迎对文章中的引用来源进行考证,欢迎指出任何有错误或不够清晰的表达。也可以邮件至 sblig@126.com