JVM Memory Layout and Tuning Notes

说明 本文是一篇较早的 JVM 调优笔记,原文涵盖的堆栈基础、GC 算法、分代模型、G1 设计目标等内容,站内已有更完整、持续维护的独立文章: GC 分代模型、回收算法、收集器与发展时间线 → Java GC HotSpot 启动参数(堆、分代比例、GC 日志、收集器选择等)→ HotSpot JVM 启动参数 堆、栈、方法区基础概念 → Java 堆栈方法区 强引用 / 软引用 / 弱引用 / 虚引用 → Java 引用类型 生产环境诊断工具(Arthas、async-profiler、JFR 等)→ Java 生产环境诊断工具选型 本文只保留原文中站内暂未覆盖的部分:对象内存布局与大小计算、一份历史调优配置示例、内存泄漏排查思路,以及关于 JVM 内存设计的一点延伸思考。 Java 对象的内存布局与大小 一个空 Object 对象在堆中的大小是 8 byte,这只是对象头的大小,不包含任何字段: Object ob = new Object(); 这行代码实际占用 4 byte + 8 byte:4 byte 是栈中保存引用所需的空间,8 byte 是堆中对象头的信息。因为所有 Java 非基本类型对象都默认继承 Object,所以任何 Java 对象的大小都必然大于 8 byte。 有了空对象的大小,可以推算其他对象的大小,例如: class NewObject { int count; boolean flag; Object ob; } 其大小为:空对象大小(8 byte)+ int(4 byte)+ boolean(1 byte)+ Object 引用(4 byte)= 17 byte。由于 JVM 对对象内存分配按 8 字节对齐,实际占用会向上取整到 24 byte。 ...

Created 14146-04-14 · Updated 16166-07-16 · 2 min · 227 words · -