У меня есть этот код, чтобы сгенерировать класс динамически и загрузить его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-ЭА) и, как ожидается, она продолжала расширяться родную память (Метапространстве), но удивительно для 1g из Метаспасе он потреблял 3g кучи в OldGen (almos т 3x из Метапространства поддерживается в течение долгого времени)
изображения показывает использование Метапространства сверхурочное и система выборка использования памяти
this email from Jon Masamitsu и this JEP ticket говорят
интернировано
String
и класс статистики, а некоторые различ данные имеют были перемещены в кучу
что именно делает это увеличение кучи, когда он загружает больше классов в Metaspace?
Спасибо Андрею, я должен был просто выполнить это, я думаю, что я не достиг такого масштаба в примере Java 7, поэтому я не видел его в Java 7 –