一个 Java 对象究竟占用多少字节?这背后的是什么?

2026-08-23 00:2340阅读0评论建站教程
  • 内容介绍
  • 文章标签
  • 相关推荐

当你在写Java代码时有可能从未仔细考虑过一个简洁的对象到底占用更多更少个内存。但这背后却隐藏着虚拟机设计、性能优化甚至是程序员思维方式的较深层逻辑。今天我们就来揭开当前这个看似简洁却充满神秘色彩的问题,是不是?。

深度解析:一个 Java 对象究竟占用多少字节?

Java 对象的基础组成:不只是数据

我心态崩了。 Java对象并不是简洁地将你声明的字段按部就班地排列起来那么简洁。虚拟机为各个对象添加了额外的元数据,这一些信息虽然不直接由程序员控制,但却作用于着对象的实际较大较小。

  • 对象头: 包含运行时数据和类型指针
  • 实例数据: 你在类中定义的各种字段值
  • 对齐填充: 确保对象较大较小是8字节或其倍数

"为哪些要这么繁杂?" 你有可能会问。这是这是因为JVM需要通过这一些额外信息来管理垃圾回收、 我懂了。 线程同步等繁杂操作。就像一辆车除了载人空间范围还需要引擎、底盘和可靠系统一样。

实战演示:让我们量一量吧!

嗯,就这么回事儿。 虚假设我们有一个非常简洁的Person类:


public class Person {
    private int id;
    private String name;
}

猜猜它占用更多更少个字节?50?80?还是更更多?

CPU你。 惊喜的是 在64位JVM中默认配置下当前这个看似简洁的类有可能会占用至更少32个字节!

`-XX:+UseCompressedOops`:压缩指针带来的变革

蚌埠住了... 为哪些百度不收录部分内容? 百度搜索引擎通常不会收录那一些被判断为较低质量、反复或无实际价值内容;同时也也会过滤掉违反网络规范或伦理准则的页面。确保内容原创性较高且具有实际实际价值是获取收录关键。

要精准计算对象较大较小,我们需要了解虚拟机有没有启用了压缩指针。 当前这个选项默认在堆内存较小于32GB时启用,能够将64位指针压缩为48位甚至32位表示。 这意味着之前那个地方的Person有可能只需要约24字节! "减肥成功!" JVM工程项目师笑着说... 采用 -XX:+PrintObjectSize=Person.classname java MainClass 能够查看实际较大较小 警告:不同JDK版本最终还是结果是有可能差异巨较大!

常见问题解答FAQs Q&A Time! "空集合也是有内存开销吗?" 是的! ArrayList初始容量为10, 盘它。 HashMap初始容量为16, 即使它们目前空着也需要分配相应数组空间范围!

当你在写Java代码时有可能从未仔细考虑过一个简洁的对象到底占用更多更少个内存。但这背后却隐藏着虚拟机设计、性能优化甚至是程序员思维方式的较深层逻辑。今天我们就来揭开当前这个看似简洁却充满神秘色彩的问题,是不是?。

深度解析:一个 Java 对象究竟占用多少字节?

Java 对象的基础组成:不只是数据

我心态崩了。 Java对象并不是简洁地将你声明的字段按部就班地排列起来那么简洁。虚拟机为各个对象添加了额外的元数据,这一些信息虽然不直接由程序员控制,但却作用于着对象的实际较大较小。

  • 对象头: 包含运行时数据和类型指针
  • 实例数据: 你在类中定义的各种字段值
  • 对齐填充: 确保对象较大较小是8字节或其倍数

"为哪些要这么繁杂?" 你有可能会问。这是这是因为JVM需要通过这一些额外信息来管理垃圾回收、 我懂了。 线程同步等繁杂操作。就像一辆车除了载人空间范围还需要引擎、底盘和可靠系统一样。

实战演示:让我们量一量吧!

嗯,就这么回事儿。 虚假设我们有一个非常简洁的Person类:


public class Person {
    private int id;
    private String name;
}

猜猜它占用更多更少个字节?50?80?还是更更多?

CPU你。 惊喜的是 在64位JVM中默认配置下当前这个看似简洁的类有可能会占用至更少32个字节!

`-XX:+UseCompressedOops`:压缩指针带来的变革

蚌埠住了... 为哪些百度不收录部分内容? 百度搜索引擎通常不会收录那一些被判断为较低质量、反复或无实际价值内容;同时也也会过滤掉违反网络规范或伦理准则的页面。确保内容原创性较高且具有实际实际价值是获取收录关键。

要精准计算对象较大较小,我们需要了解虚拟机有没有启用了压缩指针。 当前这个选项默认在堆内存较小于32GB时启用,能够将64位指针压缩为48位甚至32位表示。 这意味着之前那个地方的Person有可能只需要约24字节! "减肥成功!" JVM工程项目师笑着说... 采用 -XX:+PrintObjectSize=Person.classname java MainClass 能够查看实际较大较小 警告:不同JDK版本最终还是结果是有可能差异巨较大!

常见问题解答FAQs Q&A Time! "空集合也是有内存开销吗?" 是的! ArrayList初始容量为10, 盘它。 HashMap初始容量为16, 即使它们目前空着也需要分配相应数组空间范围!