我这里只记录java中如何计算出对象的大小这个问题。
首先,我看B站up说在对象中包装类属性的大小是4个字节,保存的是在堆中的地址。基本数据类型大小就是实际的大小。
使用RamUsageEstimator类可以帮助您更好地了解Java对象的内存使用情况,并优化您的Java应用程序的内存使用。
注:我这里只记录一下这种方式的使用,作为菜鸟,也有很多不解的地方,以后回来为自己答疑。
1、引入依赖
<!-- 计算对象大小的依赖-->
<dependency>
<groupId>org.apache.lucene</groupId>
<artifactId>lucene-core</artifactId>
<version>8.9.0</version>
</dependency>
2、写个例子测试
@Data
class MyClass {
private int value1;
private int value2;
private String value3;
private Integer integer;
public MyClass() {
this.value1 = 1;
// this.value2 = 2;
// this.value3 = "Hello, world!";
// this.integer=80;
}
}
@Test
void testObjectSize(){
// 创建一个对象
MyClass object = new MyClass();
// 计算对象的大小
long size = RamUsageEstimator.sizeOfObject(object);
// 打印对象的大小
System.out.println("指定对象本身在堆空间的大小为:" + size + " 字节");
// 计算对象的大小
long allSize = RamUsageEstimator.sizeOfObject(object);
// 打印对象的大小
System.out.println("指定对象及其引用树上的所有对象的综合大小为:" + allSize + " 字节");
}
注:网上很多写的使用sizeOf方法来计算对象及其属性在堆中的合计大小,但是我测试时候发现不能放入自定义对象,强转也会报错。我偶然间看到sizeOfObject方法是某一个版本后sizeOf的替代方法,作用是一样的。
运行结果:
指定对象本身在堆空间的大小为:256 字节
指定对象及其引用树上的所有对象的综合大小为:256 字节
我也很疑惑,为什么俩方法输出的大小是一样的,为什么即使减少类的属性个数,大小依然是256字节。
如果有大神看到,恳请指点一下。
解释:
1、对象本身在堆空间的大小:它的属性如果是对象只会保存引用地址。就不是实际属性对象的大小。
2、对象及其引用树上的所有对象的综合大小:就包含了属性对象的大小,是全部大小的总和。