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) и, как и ожидалось, продолжал расширять собственную память (Metaspace), но неожиданно для 1g Metaspace он потреблял 3g Heap в OldGen (почти 3x Metaspace поддерживалось с течением времени)
изображение показывает сверхурочное использование Metaspace и пример использования системной памяти
это письмо от Джона Масамицу а такжеэтот билет JEP говорит
интернированыString
и статистика классов и некоторые разные данные были перемещены в кучу
что именно делает это увеличение в куче, поскольку он загружает больше классов в Metaspace?