我有这样的代码来动态生成类和装载它Java8元空间和堆使用
import javassist.CannotCompileException;
import javassist.ClassPool;
public class PermGenLeak {
private static final String PACKAGE_NAME = "com.jigarjoshi.permgenleak.";
public static void main(String[] args) throws CannotCompileException, InterruptedException {
for (int i = 0; i < Integer.MAX_VALUE; i++) {
ClassPool pool = ClassPool.getDefault();
pool.makeClass(PACKAGE_NAME + i).toClass();
Thread.sleep(3);
}
}
}
我发起这个类在Java 7(jdk1.7.0_60)和如预期它填满PermGenSpace和堆保持未使用的 图像显示的PermGen使用超时并在结束JVM终止
现在相同的代码撞上了的Java 8(jdk1.8.0_40-EA),并如预期它不断扩大天然存储器(元空间),但令人惊讶的对1g Metaspace在OldGen中消耗了3g堆(almos元空间中的吨3×随时间保持)
图像显示元空间中使用的加班费和系统内存使用样品
this email from Jon Masamitsu和this JEP ticket说
实习
String
和类的统计信息和一些其它的数据具有已移至堆
当堆中有更多的类加载到Metaspace时,究竟是什么导致了堆的增加?
谢谢安德烈,我应该刚刚执行这个,我想我没有达到这个规模在Java 7的例子,这就是为什么我没有看到它在Java 7中 – 2014-10-19 22:53:39