备忘24:Java内存区域

如题所述

文档内容参考Guide,原文链接:javaGuide

Java 虚拟机在执行 Java 程序的过程中,划分了不同数据区域以管理内存。这些区域包括运行时数据区域、程序计数器、Java 虚拟机栈、本地方法栈、堆以及方法区,各区域功能和特点各异。

运行时数据区域主要指堆和方法区,堆为所有线程共享,用于存放对象实例,大小动态可扩展,支持垃圾回收,新生代和老年代划分以优化回收。方法区存储已被加载类的信息、常量、静态变量等,不同虚拟机实现方法区的方式不同。永久代(PermGen)被元空间(Metaspace)取代,元空间使用本地内存,受系统内存限制。

程序计数器、Java 虚拟机栈、本地方法栈则为线程私有,其中程序计数器用于指示当前线程正在执行的字节码指令行号,Java 虚拟机栈和本地方法栈用于存储局部变量、操作数栈等,支持函数调用和返回。

字符串常量池用于存储字符串字面量和符号引用,减少内存重复。HotSpot 虚拟机中的字符串常量池由 StringTable 管理,存储字符串对象引用,JDK1.7 之后,字符串常量池从永久代移动到堆中。

直接内存是通过本地方法库分配的内存缓冲区,不在堆或方法区中,但同样影响程序性能,可能导致 OutOfMemoryError。

对象的创建涉及类加载检查、内存分配、初始化零值、设置对象头以及执行初始化方法。对象内存布局分为对象头、实例数据和对齐填充,其中对象头存储运行时数据,实例数据存储具体字段内容,对齐填充确保内存对齐。

对象的内存访问定位主要依赖栈上的 reference 数据,可以采用句柄或直接指针方式,句柄方式下,reference 存储对象句柄地址,句柄包含实例数据与类型数据地址,直接指针方式下,reference 直接存储对象地址,后者访问速度更快。
温馨提示:答案为网友推荐,仅供参考
相似回答
大家正在搜