1. 1. 运行时数据区
  2. 2. 栈的动态链接
  3. 3. 栈深度扩展
  4. 4. 新生代晋升
  5. 5. 堆空间OOM报错信息
  6. 6. 元空间溢出报错信息
  7. 7. 对象创建过程
  8. 8. 对象内存布局

运行时数据区

image-20260131210426310

栈的动态链接

在 Class 文件中,方法调用以符号引用的形式存在于常量池。为了执行调用,这些符号引用必须被转换为内存中的直接引用。这个转换过程分为两种情况:对于静态方法、私有方法等在编译期就能确定版本的方法,这个转换在类加载的解析阶段就完成了,这称为静态解析。而对于需要根据对象实际类型才能确定具体实现的虚方法(这是实现多态的基础),这个转换过程则被推迟到程序运行期间,由动态链接来完成。因此,动态链接的核心作用是在运行时解析虚方法的调用点,将其链接到正确的方法版本上

栈深度扩展

虚拟机栈的深度由虚拟机决定。但是HotSpot虚拟机不允许扩展

  • 如果不支持扩展,栈溢出报错信息:
    StackOverFlowError
  • 如果支持扩展,当虚拟机在扩展栈空间不够时,则抛出:
    OutOfMemoryError

新生代晋升

  1. 新生代到老年代晋升年龄,最大为15岁,即进行minor GC15次仍然存在的对象,会晋升到老年代。

    • 因为年龄字段保存在对象头的标记字段。占4位最大值为15,所以晋升年龄只能是0 ~ 15
  2. 但是这个晋升年龄是会变化的

    • HotSpot遍历所有对象的时候,按照年龄从小到大将对象大小进行累加,当累加到某个年龄时,所累加的大小超过了Survivor区的一半,则取这个年龄和MaxTenuringThreshold的最小值,作为新的晋升年龄阈值

堆空间OOM报错信息

  1. 如果当JVM花太多时间执行垃圾回收且只能回收很少的堆空间时:
    • java.lang.OutOfMemoryError: GC Overhead Limit Exceeded
  2. 如果在创建新的对象,堆内存中的空间不足以存放新创建的对象时:
    • java.lang.OutOfMemoryError: Java heap space

元空间溢出报错信息

  • java.lang.OutOfMemoryError: MetaSpace

对象创建过程

image-20260201170854724

  1. 类加载检查
  2. 内存分配
  3. 初始化零值
  4. 设置对象头
  5. 调用init方法,设置字段值

对象内存布局

image-20260201172237126

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