UseAdaptiveSizePolicy 选项引起Memory pool not found异常。

本文探讨了Memorypoolnotfound异常的原因及解决方案。此异常与mbean相关,在使用cms垃圾回收算法并开启了UseAdaptiveSizePolicy参数的情况下出现。文章详细解释了问题产生的背景,并给出了解决建议。

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

Memory pool not found异常是mbean的异常,所以出现这个异常一定是使用了mbean.

开始怀疑的情况是JVM还没有初始化,agent中的mbean已经开始获取状态,或者JVM将要crash之前,mbean获取不到正确状态,但都没有这些情况 。

后来taobao-jdk团队进行分析,原因出在UseAdaptiveSizePolicy上。

大概原因:
在使用cms算法下,如果开启参数UseAdaptiveSizePolicy,则每次minor gc后会重新计算eden,from和to的大小,计算过程依据的是gc过程统计的一些数据,计算后的eden+from+to不会超过Xmx,同时from和to一般是不相等(初始化的时候from和to是相等的)。主要问题在于计算完后,如果eden变大,ContiguousSpacePool里面的max_eden_size并没有被更新,还是最开始时候的值,这样导致jvm在通过call_special调用java.lang.management. MemoryUsage的构造函数的时候会产生exception,产生exception的原因是eden的committed 大于 eden的max_size,导致返回java.lang.management. MemoryUsage对象失败,最终导致产生显示异常。

sun的jdk到目前并没有修改该bug。

解决办法:可以先设置 –XX:-UseAdaptiveSizePolicy来workaround。

评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值