我有這樣的代碼來動態生成類和裝載它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