JVM学习笔记-内存溢出 (二)

2014-11-24 10:33:31 · 作者: · 浏览: 3
a;

import java.lang.reflect.Method;
import net.sf.cglib.proxy.Enhancer;
import net.sf.cglib.proxy.MethodInterceptor;
import net.sf.cglib.proxy.MethodProxy;

public class TestMethodAreaOverflow {

static class MethodAreaOom {}

public static void main(String[] args) {
while (true) {
Enhancer enhancer = new Enhancer();
enhancer.setSuperclass(MethodAreaOom.class);
enhancer.setUseCache(false);
enhancer.setCallback(new MethodInterceptor() {

@Override
public Object intercept(Object arg0, Method arg1, Object[] arg2,
MethodProxy proxy) throws Throwable {
return proxy.invoke(arg0, arg2);
}
});
enhancer.create();
}
}

}

package com.jony.java;

import java.lang.reflect.Method;
import net.sf.cglib.proxy.Enhancer;
import net.sf.cglib.proxy.MethodInterceptor;
import net.sf.cglib.proxy.MethodProxy;

public class TestMethodAreaOverflow {

static class MethodAreaOom {}

public static void main(String[] args) {
while (true) {
Enhancer enhancer = new Enhancer();
enhancer.setSuperclass(MethodAreaOom.class);
enhancer.setUseCache(false);
enhancer.setCallback(new MethodInterceptor() {

@Override
public Object intercept(Object arg0, Method arg1, Object[] arg2,
MethodProxy proxy) throws Throwable {
return proxy.invoke(arg0, arg2);
}
});
enhancer.create();
}
}

}
运行结果:
Exception in thread "main" net.sf.cglib.core.CodeGenerationException: java.lang.reflect.InvocationTargetException-->null
at net.sf.cglib.core.AbstractClassGenerator.create(AbstractClassGenerator.java:237)
at net.sf.cglib.proxy.Enhancer.createHelper(Enhancer.java:377)
at net.sf.cglib.proxy.Enhancer.create(Enhancer.java:285)
at com.jony.java.TestMethodAreaOverflow.main(TestMethodAreaOverflow.java:26)
Caused by: java.lang.reflect.InvocationTargetException
at sun.reflect.GeneratedMethodAccessor1.invoke(Unknown Source)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:616)
at net.sf.cglib.core.ReflectUtils.defineClass(ReflectUtils.java:384)
at net.sf.cglib.core.AbstractClassGenerator.create(AbstractClassGenerator.java:219)
... 3 more
Caused by: java.lang.OutOfMemoryError: PermGen space
at java.lang.ClassLoader.defineClass1(Native Method)
at java.lang.ClassLoader.defineClass(ClassLoader.java:634)
... 8 more
4.Runtime Constant Pool In Method Area溢出
在运行时产生大量常量就可以让Method Area溢出,运行时常量可以用String类的intern方法,不断产生新的常量。
[java]
package com.jony.java;

import java.util.ArrayList;

public class RCPverflow {

public static void main(String[] args) {
ArrayList list = new ArrayList();
int i = 0;
while (true) {
list.add(String.valueOf(i++).intern());
}
}

}

package com.jony.java;

import java.util.ArrayList;

public class RCPverflow {

public static void main(String[] args) {
ArrayList list = ne