java中如何计算出对象的大小,设置JVM参数,防止OOM问题

文章介绍了如何在Java中使用RamUsageEstimator类来计算对象的内存占用,包括对象本身和其引用树上所有对象的大小。通过一个实例展示了如何引入依赖并进行测试,尽管作者发现某些方法的输出结果与预期不符,且对结果有疑问。
摘要由CSDN通过智能技术生成

我这里只记录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、对象及其引用树上的所有对象的综合大小:就包含了属性对象的大小,是全部大小的总和。

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值