Java 为什么PermGen没有更快地填充?

Java 为什么PermGen没有更快地填充?,java,memory-leaks,permgen,Java,Memory Leaks,Permgen,我想尽快调用OutOfMemoryError:PermGen spaceerror 我已经创建了自定义类加载器: public class MyClassLoader extends URLClassLoader { private MyClassLoader(URL[] urls) { super(urls); } @Override public Class<?> loadClass(String name) throws ClassNotFoundException

我想尽快调用
OutOfMemoryError:PermGen space
error

我已经创建了自定义类加载器:

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);
    }
}

}
package com.memory.leaks;

public class Leak  {

}
此代码将导致OOME。 然后我修改了
Leak
类,添加了20个名称很长的方法:

public void aaaaaaaaaaaaaaaa ...~ 50 chars... aaaaaaaa () {
}
由于方法名驻留在PermGen中,这样的修改应该会加快填充PermGen的速度。然而,动态分析(使用JVisualVM和VisualGC)表明,它以几乎相同的速度完成:

修改前(71s):

修改后(69s):


我的问题很简单:为什么?

为什么具有长名称的方法会显著增加类使用的空间量?类装入器将插入方法名,注意该字符串已经存在于内存中,并使用该字符串而不是新字符串


如果你想增加一个类占用的空间,那么就声明大量的静态字段。

那是哪个Java版本?FWIW,Orcle的JRE(8+)不再有permgen了,它是Oracle JRE 1.7。我知道PermGen在JRE 1.8中被元空间取代了。我完全忘记了静态字段也存在于PermGen中。谢谢