Java 对象生命周期
从
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 方法区的回收——废弃常量和无用的类
六、总结与思考
- 日常编码中如何根据对象生命周期优化内存使用
- 延伸:逃逸分析与栈上分配
本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来源 谜思录!