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

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。

你可能感兴趣的:(UseAdaptiveSizePolicy 选项引起Memory pool not found异常。)