Я хочу вызвать OutOfMemoryError: PermGen space
ошибки как можно скорее.Почему PermGen не заселен быстрее?
Я создал специальный загрузчик классов:
public class MyClassLoader extends URLClassLoader {
private MyClassLoader(URL[] urls) {
super(urls);
}
@Override
public Class<?> loadClass(String name) throws ClassNotFoundException {
if (name.equals("com.memory.leaks.Leak")) {
return findClass(name);
}
return super.loadClass(name);
}
static IStructure newInstance() {
try {
final URL classSource = Structure.class.getProtectionDomain().getCodeSource().getLocation();
try (URLClassLoader cl = new MyClassLoader(new URL[] { classSource })) {
return (ILeak) cl.loadClass("com.memory.leaks.Leak").newInstance();
}
} catch (Exception e) {
throw new RuntimeException(e);
}
}
}
и вот Leak
класс загружается этим загрузчиком классов:
package com.memory.leaks;
public class Leak {
}
Этот код будет вызывать OOME уже. Затем я изменил Leak
класс добавления 20 методов с очень длинными именами к нему:
public void aaaaaaaaaaaaaaaa ...~ 50 chars... aaaaaaaa() {
}
Так как имена методов находится в PermGen, такое изменение должно ускорить заполнение PermGen. Тем не менее, динамический анализ (с использованием JVisualVM с VisualGC) показывает, что это делается практически с той же скоростью:
перед модификацией (71s):
После модификации (69s):
Мой вопрос прост: зачем?
Что такое Java-версия? FWIW, у JRE Orcle (8+) больше нет перменья – fge
Это был Oracle JRE 1.7. Я знаю, что PermGen был заменен Metaspace в JRE 1.8. – Kao