2014-12-29 7 views
1

Я хочу вызвать 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):

Before modification

После модификации (69s):

After modification

Мой вопрос прост: зачем?

+0

Что такое Java-версия? FWIW, у JRE Orcle (8+) больше нет перменья – fge

+0

Это был Oracle JRE 1.7. Я знаю, что PermGen был заменен Metaspace в JRE 1.8. – Kao

ответ

2

Почему метод с длинным именем значительно увеличивает объем пространства, используемого классом? Класс загрузчик будет ставить имя метода, обратите внимание, что строка уже существует в памяти и использует эту строку, а не новую строку.

Если вы хотите увеличить объем пространства, занятого классом, тогда объявите много статических полей.

+0

Я полностью забыл, что статические поля тоже находятся в Перменгене. Благодаря! – Kao

Смежные вопросы