OOM详解

OOM(OutOfMemory)是每个Javaer应该明白的东西,以前我遇到的时候就search it并调整JVM启动参数,但是具体怎么回事嘛?知道学习了并发和JVM才真正明白。

永久区内存溢出(Caused by: java.lang.OutOfMemoryError: PermGen space)

我们先来认识OOM发生的时机,写一段如下代码,不断动态地创建PermTestClass类(不是对象)。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
//省略类定义
public static void main(String[] args) {
test();
}
public static void test() {
while (true) {
Enhancer enhancer = new Enhancer();
enhancer.setSuperclass(PermTestClass.class);
enhancer.setUseCache(false);
enhancer.setCallback(new MethodInterceptor() {
@Override
public Object intercept(Object obj, Method method, Object[] args,
MethodProxy proxy) throws Throwable {
System.out.println("test");
return proxy.invoke(obj, args);
}
});
enhancer.create();//动态的创建一个PermTestClass类(不是对象)。
}
}
static class PermTestClass {
}

运行之,讲道理的话一会就会OOM。不过有个前提,PermSize应该设置的比较小,才容易观察到。否则,甚至是不会OOM,如果GC(垃圾回收)够快的话。

运行结果:
code module

运行开始时,使用jps来查看运行的java进程,然后使用jstat查看gc情况。
code module

##