JVM指针压缩性能问题

    当前一台个人台式机的内存都能随随便便超过4G内存,所以现在基本上大家用的都是64位的JVM。对于32位的JVM来说,对象引用(指针)的长度是32位,能表示的最大范围是2^32 = 4G,而对于64位的JVM来说,对象应用的长度就变成了2^64...懒得算剋以表示多大的范围了,总之来说就是64位长度的指针有点浪费了,平白增加了内存的损耗和GC开销。

    所以在JDK 1.6的版本后,64位的JVM默认情况下是开启指针压缩(-XX: +UseCompressedOops)来压缩我们对象指针的大小来帮助我们节约内存空间。

 

如何进行指针压缩:

    简单来说就是如何使用32位的指针来指向32G的空间

    32位的指针只能表示4G的空间,如果32G的空间每8个字节表示一个单元,指针指向的是每个单元,那么32位的指针就可以指向32G的空间了。

    而JVM也正是这么实现的。将最低位空间设置为初始值,其他空间以其作为offset进行表示,从而达到32位指针表示32G空间的效果。

 

指针压缩后的性能:

    注意,如果内存在4G以下,JVM会直接使用低32位,无需指针压缩。如果内存在32G以上,那么JVM就不会进行指针压缩(JVM在40/50G时才能达到32G的效果)。所以我们应当尽量JVM的内存在32G以下

    以项目中使用Spark为例,相比较于使用一个90G的Executor,分成3个30G的Executor,内存使用率以及计算速度都能提升30%以上。

 

 

 

参考:

    https://www.cnblogs.com/wanhua-wu/p/9305372.html(不分配大内存给ES)

    https://juejin.im/post/5c4c8ad9f265da6179752b03(JVM如何进行指针压缩)

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值