运行时数据区

Java虚拟机运行时数据区结构

妖精的绣舞 提交于 2019-11-29 12:42:57
本文部分参考自《Java虚拟机规范(Java SE 7版)》的中译本和周志明的《深入理解Java虚拟机》,另加个人理解。原书对Java虚拟机运行时数据区描述只有6页,同时参考其他网络网资料,个人能力所限,不排除存在认知错误。 JVM将程序运行期间使用的内存划分为若干个运行时数据区,其中一些会随着虚拟机启动而创建,随着虚拟机退出而销毁。另外一些与线程一一对应,随着线程开始而创建,随着线程结束而销毁。数据区划分如下图所示意: Java堆(Java Heap) 在JVM中,Java堆是可供各个线程共享的运行时内存区域,是供所有类实例和数组对象分配内存的区域。 Java堆在虚拟机启动时被创建,存储了垃圾收集器(GC)管理的各种对象,这些对象无法显式销毁。 Java堆可能发生 OutOfMemoryError错误。 方法区(Method Area) 方法区用于存储已被虚拟机加载的类的结构信息,例如:运行时常量池、字段和方法数据、构造函数和普通方法的字节码,还包括一些在类、实例、接口初始化时用到的特殊方法。 方法区 逻辑上是Java堆的一部分,但JVM规范对方法区限制非常宽松,可以选择不实现垃圾收集。实际因为类型卸载的条件非常苛刻,方法区的垃圾收集效果也不理想。 方法区 可能发生 OutOfMemoryError错误。 运行时常量池(Runtime Constant Pool)