Java空对象内存占用与JVM内存模型解析


编程相关书籍分享:https://blog.csdn.net/weixin_47763579/article/details/145855793
DeepSeek使用技巧pdf资料分享:https://blog.csdn.net/weixin_47763579/article/details/145884039


一、空Object对象的内存占用

在64位JVM(开启指针压缩)环境下,一个空的Object对象占用16字节内存,具体构成如下:
Mark Word:50%
Klass Pointer:25%
对齐填充:25%

50% 25% 25% 空Object内存分布 Mark Word Klass Pointer 对齐填充

二、JVM对象内存结构

1. 对象内存布局

对象头 Header
Mark Word
Klass Pointer
实例数据 Instance Data
对齐填充 Padding
1.1 对象头(Header)
组成部分 64位JVM(开启压缩) 64位JVM(关闭压缩)
Mark Word 8 bytes 8 bytes
Klass Pointer 4 bytes 8 bytes
1.2 实例数据

存储对象字段,基础类型按实际大小存储,引用类型在开启压缩时为4 bytes

1.3 对齐填充

保证对象总大小为8字节的整数倍

2. 指针压缩优化

graph TD
    A[指针压缩] --> B[减少内存占用]
    A --> C[提升缓存效率]
    A --> D[默认开启]
    B --> E[Klass Pointer从8→4字节]
    C --> F[L1缓存命中率提升]

三、不同场景下的对象大小

2025-03-13 2025-03-13 2025-03-13 2025-03-13 2025-03-13 2025-03-13 2025-03-13 2025-03-13 2025-03-13 2025-03-13 2025-03-13 2025-03-13 2025-03-13 2025-03-13 2025-03-13 2025-03-13 Integer int[3] Object int[0] 普通对象 数组对象 不同对象内存占用对比

四、内存占用测量方法

1. 使用JOL工具

// 添加依赖:org.openjdk.jol:jol-core
public class MemoryLayout {
    public static void main(String[] args) {
        System.out.println(ClassLayout.parseClass(Object.class).toPrintable());
    }
}

2. 输出示例

java.lang.Object object internals:
OFF  SZ   TYPE DESCRIPTION               VALUE
  0   8        (object header: mark)     0x0000000000000001
  8   4        (object header: class)    0x00001000
 12   4        (object alignment gap)    
Instance size: 16 bytes

五、内存优化建议

  1. 对象复用:使用对象池减少对象创建
  2. 字段优化
    • 优先使用基本类型
    • 避免过度包装
    • 合理排列字段顺序(long/double优先)
  3. 数据结构选择
    • 数组优先于集合
    • 原始类型集合(如Trove)
  4. JVM参数调优
    -XX:+UseCompressedOops      # 启用指针压缩
    -XX:ObjectAlignmentInBytes # 调整对齐基数(默认8)
    

六、扩展知识

  1. 继承体系的影响

    • 每个子类继承父类的字段
    • 虚方法表(vtable)不占用对象空间
  2. 数组对象特殊结构

    数组对象头
    Mark Word
    Klass Pointer
    数组长度
    数组元素
    元素1
    元素2
    ...
  3. 内存分配流程

    JVM TLAB Eden 尝试线程本地分配 分配成功 申请新TLAB 分配新内存块 alt [TLAB空间不足] 若Eden区不足时触发Minor GC JVM TLAB Eden

通过深入理解JVM内存模型,开发者可以更好地进行性能优化和内存管理。建议使用JOL工具进行实际验证,不同JVM实现和版本可能存在差异。
Logo

GitCode 天启AI是一款由 GitCode 团队打造的智能助手,基于先进的LLM(大语言模型)与多智能体 Agent 技术构建,致力于为用户提供高效、智能、多模态的创作与开发支持。它不仅支持自然语言对话,还具备处理文件、生成 PPT、撰写分析报告、开发 Web 应用等多项能力,真正做到“一句话,让 Al帮你完成复杂任务”。

更多推荐