new 关键字到被 GC 回收,一个 Java 对象在 JVM 中经历了什么?

一、对象的诞生:new 关键字背后

  • 1.1 类加载检查——符号引用解析为直接引用
  • 1.2 内存分配策略——指针碰撞 vs 空闲列表
  • 1.3 TLAB(线程本地分配缓冲)——减少并发竞争
  • 1.4 初始化零值——为什么字段有默认值
  • 1.5 对象头设置——Mark Word 里存了什么
  • 1.6 <init> 方法执行——构造器的调用时机

二、对象的内存布局

  • 2.1 对象头(Mark Word + Klass Pointer)——32 位 vs 64 位 JVM 的区别
  • 2.2 实例数据——字段的排列顺序与对齐填充
  • 2.3 压缩指针——-XX:+UseCompressedOops 原理与限制
  • 2.4 一个 Object obj = new Object() 到底占多少内存

三、对象的访问定位

  • 3.1 句柄访问 vs 直接指针访问——HotSpot 的选择
  • 3.2 两种方式的优缺点对比

四、对象的”活着”——引用类型

  • 4.1 强引用、软引用、弱引用、虚引用的区别
  • 4.2 ReferenceQueue 的应用场景
  • 4.3 软引用在缓存中的实践

五、对象的消亡——GC 判断

  • 5.1 引用计数法的缺陷——循环引用问题
  • 5.2 可达性分析——GC Roots 有哪些
  • 5.3 finalize() 的自救机会——但不推荐
  • 5.4 方法区的回收——废弃常量和无用的类

六、总结与思考

  • 日常编码中如何根据对象生命周期优化内存使用
  • 延伸:逃逸分析与栈上分配