互联网云服务器JVM监控——JDK自带工具( 二 )


while(true){
Enhancer eh = new Enhancer();
eh.setSuperclass(OOMOjbect.class);
eh.setUseCache(false);
eh.setCallback(new MethodInterceptor(){
 
@Override
public Object intercept(Object arg0, Method arg1,
Object[] arg2, MethodProxy arg3) throws Throwable {
// TODO Auto-generated method stub
return arg3.invokeSuper(arg0, arg2);
}
 
});
eh.create();
}
}
 
}
分析:
我们知道方法区是存放一些类的信息等,所以我们可以使用类加载无限循环加载class,这样就会出现方法区的OOM异常 。
手动将栈的大小调小点
加上JVM参数:-XX:PermSize=10M -XX:MaxPermSize=10M,运行后会报如下异常:
Exception in thread "main"
java.lang.OutOfMemoryError: PermGen space 。
常量池溢出public class ConstantOOM {
 
/**
* @param args
*/
public static void main(String[] args) {
// TODO Auto-generated method stub
List<String> list = new ArrayList<String>();
int i=0;
while(true){
list.add(String.valueOf(i++).intern());
}
}
 
}
分析:
我们知道常量池中存放的是运行过程中的常量,同时我们知道String类型的intern方法是将字符串的值放到常量池中的 。所以上面弄可以开一个死循环将字符串的值都放到常量池中,这样常量池就会出现OOM异常了 。因为常量池本身就是方法区的一部分,所以我们也可以手动地调节一下栈的大小 。
推荐:
《深入理解Java虚拟机》

【互联网云服务器JVM监控——JDK自带工具】


推荐阅读