计算Java对象大小(附实际例子分析)


对象大小如何计算

对象大小包括俩部分的内容,对象头和对象内容。(图片源于网络)
在这里插入图片描述

对象头

此处假设是64位的JVM

  • 对象地址,占4个字节。
  • 对象标记,占8个字节,包括锁标记,hashcode, age 等。
  • 数组长度标记,占4哥字节。如果对象是一个数组,会有此标记,否则没有。

对象内容

  • 对象内部属性。如果属性是对象的话,那么记录的是对象的地址,占用4个字节。

8字节对齐

  • Java对象采用的是8字节对齐。对象大小必须是8的倍数,不足需要补齐。比如,计算一个对象只需要20字节,那么实际占用24字节。

计算对象大小

  • 引入 如下的 pom文件
 <dependency>
         <groupId>org.apache.lucene</groupId>
         <artifactId>lucene-core</artifactId>
         <version>8.7.0</version>
 </dependency>
  • 测试
 Integer i = new Integer(11);
 System.out.println(RamUsageEstimator.shallowSizeOf(i));
 
 output:
 16
 Map<String, String> map = new HashMap<>();
 System.out.println(RamUsageEstimator.shallowSizeOf(map));
 
 output:
 48

分析

Integer 对象大小分析

  • 它是对象,占用4个字节
  • 对象标记,占用8个字节
  • 查看源码,发现Integr 内容只有以下一个非static的属性,是一个int的基本类型属性,占用4个字节.static 修饰的方法属性都是存储在方法区的,不占用对象空间。
    /**
     * The value of the {@code Integer}.
     *
     * @serial
     */
    private final int value;
  • 故 total = 4 + 8 + 4 = 16

HashMap 对象大小分析

  • 它是对象,占用4个字节
  • 对象标记,占用8个字节
  • 查看源码,HashMap 是继承了 AbstractMap 的,AbstractMap 中有以下的俩个属性,一共占用8个字节。因为只是存储了keySet, values 的地址
transient Set<K>        keySet;
transient Collection<V> values;
  • HashMap 中有以下属性,共占用 6 * 4 = 24 个字节。
transient Node<K,V>[] table;
transient Set<Map.Entry<K,V>> entrySet;
transient int size;
transient int modCount;
int threshold;
final float loadFactor;
  • total = 4 + 8 + 8 + 24 = 44, 由于java 是8字节对齐的,故一共是 48 字节。
  • 2
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

爱coding的同学

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值