[Java] 计算 Java 对象大小
序
在 Java 应用程序的性能优化场景中,时常需要考虑 Java 对象的大小,以便观测、评估后,进一步提出优化方案:
占用内存的大小。(比如 本地内存)
对象数据在网络传输中占用的网络带宽
对象数据在存储时占用的磁盘空间
...
概述
对象大小如何计算
对象大小包括俩部分的内容,对象头和对象内容:
对象头
此处假设是 64 位的 JVM
对象地址,占 4 个字节。
对象标记,占 8 个字节,包括锁标记,hashcode, age 等。
数组长度标记,占 4 个字节。如果对象是一个数组,会有此标记,否则没有。
对象内容
对象内部属性。如果属性是对象的话,那么记录的是对象的地址,占用 4 个字节。
8 字节对齐
Java
对象采用的是 8 字节对齐。对象大小必须是8
的倍数,不足需要补齐。
比如,计算一个对象只需要 20 字节,那么实际占用 24 字节。
计算对象大小的方法
方法 1 和方法 2,在 String 对象的计算上,存在差异;Integer 和 Map 的计算,经简单检验:不存在差异。
方法 1:基于 JDK 原生库 【推荐】
方法 2:基于lucene-core
库
引入依赖
计算对象大小
jdk 1.8
案例分析(基于lucene-core
库)
Integer 对象大小分析
它是对象,占用 4 个字节
对象标记,占用 8 个字节
查看源码,发现:
Integr
内容只有以下一个非 static 的属性,是一个int
的基本类型属性,占用4
个字节.static
修饰的方法属性都是存储在方法区的,不占用对象空间。
故 total = 4 + 8 + 4 = 16
HashMap 对象大小分析
它是对象,占用 4 个字节
对象标记,占用 8 个字节
查看源码,发现:
HashMap 是继承了 AbstractMap 的,AbstractMap 中有以下的俩个属性,一共占用 8 个字节。因为只是存储了 keySet, values 的地址
HashMap 中有以下属性,共占用 6 * 4 = 24 个字节。
total = 4 + 8 + 8 + 24 = 44, 由于 java 是 8 字节对齐的,故一共是 48 字节。
文章转载自:千千寰宇
评论