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中。谢谢