UseAdaptiveSizePolicy与CMS垃圾回收同时使用的深层分析(二)

2014-11-24 08:36:57 · 作者: · 浏览: 1
,导致返回java.lang.management. MemoryUsage对象失败,最终导致产生显示异常。
sun的jdk到目前并没有修改该bug。
JVM实现分析:management.cpp代码中,在计算堆内存区大小的时候,对commit都累加了的,但是在max_size没有定义(无效,从MemoryPool获取)的情况下,total_max没有累加,导致commited比max大。修复后的代码见:http://hg.openjdk.java.net/hsx/hsx25/hotspot/file/a70566600baf/src/share/vm/services/management.cpp的方法JVM_ENTRY中。 对比:
原来只处理:
if (!has_undefined_max_size) {
total_max += u.max_size();
}
修复该问题的方式:增加代码处理没有定义init和max的情况
if (has_undefined_init_size) {
total_init = (size_t)-1;
}
if (has_undefined_max_size) {
total_max = (size_t)-1;
}
2) jmap出现不能获取的原因:(UseAdaptiveSizePolicy + CMS同时使用会出现) (该状况 源码: sun/jvm/hotspot/memory/GenerationFactory.java ):
try {
return (Generation) ctor.instantiateWrapperFor(addr);
} catch (WrongTypeException e) {
return new Generation(addr) {
public String name() {
return "unknown generation type";
……
四、解决办法:
解决办法:可以先设置 –XX:-UseAdaptiveSizePolicy来workaround。
JDK的版本:sun jdk出问题后的版本目前看是只有jdk8修复。openjdk是hs25修复。