运行时数据区

栈的动态链接
在 Class 文件中,方法调用以符号引用的形式存在于常量池。为了执行调用,这些符号引用必须被转换为内存中的直接引用。这个转换过程分为两种情况:对于静态方法、私有方法等在编译期就能确定版本的方法,这个转换在类加载的解析阶段就完成了,这称为静态解析。而对于需要根据对象实际类型才能确定具体实现的虚方法(这是实现多态的基础),这个转换过程则被推迟到程序运行期间,由动态链接来完成。因此,动态链接的核心作用是在运行时解析虚方法的调用点,将其链接到正确的方法版本上。
栈深度扩展
虚拟机栈的深度由虚拟机决定。但是HotSpot虚拟机不允许扩展
- 如果不支持扩展,栈溢出报错信息:
StackOverFlowError - 如果支持扩展,当虚拟机在扩展栈空间不够时,则抛出:
OutOfMemoryError
新生代晋升
新生代到老年代晋升年龄,最大为15岁,即进行minor GC15次仍然存在的对象,会晋升到老年代。
- 因为年龄字段保存在对象头的标记字段。占4位最大值为15,所以晋升年龄只能是0 ~ 15
但是这个晋升年龄是会变化的
- HotSpot遍历所有对象的时候,按照年龄从小到大将对象大小进行累加,当累加到某个年龄时,所累加的大小超过了Survivor区的一半,则取这个年龄和MaxTenuringThreshold的最小值,作为新的晋升年龄阈值
堆空间OOM报错信息
- 如果当JVM花太多时间执行垃圾回收且只能回收很少的堆空间时:
java.lang.OutOfMemoryError: GC Overhead Limit Exceeded
- 如果在创建新的对象,堆内存中的空间不足以存放新创建的对象时:
java.lang.OutOfMemoryError: Java heap space
元空间溢出报错信息
- java.lang.OutOfMemoryError: MetaSpace
对象创建过程

- 类加载检查
- 内存分配
- 初始化零值
- 设置对象头
- 调用init方法,设置字段值
对象内存布局

- 内存布局包括对象头、实例数据、对齐填充