对象池的使用效果(含GC图)

本文探讨了在大数据处理场景中,使用对象池对内存、CPU和垃圾收集(GC)性能的影响。实验结果显示,虽然对象池降低了CPU使用率和内存消耗,但在这种特定情况下并未减少GC次数和时间。原因在于DTO对象主要由数据库查询产生,每次查询仍需创建新对象,导致对象复用不明显。此外,对象池导致磁盘使用量增加,OldGen区域使用减少,说明大对象直接进入老年代。结论是对象池在某些场景下能优化资源,但需结合实际应用效果考虑。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

     项目背景: 服务接收队列里头的数据,然后进行查询数据,计算,更新数据保存。所有的数据都是计算完即丢弃。计算的数据DTO 还是比较大的。

    分析:发现数据YGC 比较频繁,平均4次/min,gc情况如下图:每分钟3次,每分钟:0.3秒。平均起来就是每个20秒YGC 一次。同时发现,Eden区每次GC之后内存几乎都节省出一个多G的内存。即Eden 去大部分的对象都是失效的数据。真正存活的对象只有20~30M而已。具体如下图:

疑问:对改计算的DTO使用对象池会如何?会不会节省GC时间,内存使用量是不是会有所下降?

在项目中引入对象池,然后动态的做了对象池的开关。然后试验结果如下:

左右两边的分别是未使用的对象池,和使用对象池。

1. 可以看到:未使用对象池,可使用内存大约1000M,使用对象池大约有3000M

2. GC 次数,时间反而比较多了?

(ps :运行几个小时之后,使用对象池的GC次数和时间比未使用对象池的略微好一些)

3. Eden 去为使用对象池时,GC效果明显,可回收的内存很多,使用对象池之后,GC 效果明显稍差,可回收的内存变少了许多,Old Gen 使用的空间明显变少了许多

原因是对象都放内存里头占用空间了。至于old Gen变少的原因是,计算的DTO对象过大,申请内存时大于阈值,所以直接被分配到老年代了

4. 使用磁盘的使用量明显升高了不少

 

5. 使用对象池CPU稍微的减少了一些,因为对象池减少了频繁的创建对象

5. 使用对象池内存稍微的减少了一些

 

 

 

最终的结论:

1. 使用对象池,可以减少内存,cpu的使用。 有利于控制系统资源。

2. 本次的场景中使用的对象池,并没有达到减少GC次数,也没有减少GC的时间。

    事后分析,DTO里面充填的数据每次都是冲数据库查询出来的,每次查询都会New 一个新的对象,所以还是会频繁的创建对象,故没有达到对象复用的目的。

 

对象的介绍与使用详见:《对象池的介绍与使用》

或:https://blog.youkuaiyun.com/Dream_bin/article/details/116242953

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

Dream_bin

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

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

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

打赏作者

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

抵扣说明:

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

余额充值