public class MethodAreaOutOfMemory { public static void main(String[] args) { while(true){ new User(); } } } class User{ private String name; private int age; } 这个会产生
都是在eden区增长消耗,然后new出来的,jvm的垃圾回收会把他收回去,所以出现了上下上下的折线,而且底部最低点都一致说明没有内存泄漏,
内存泄漏的概念是指,有对象是jvm已经无法回收了,明明代码里失去了引用,但是jvm却无法识别这些对象是否可以回收,就一直留在内存里,最后就导致系统down掉。
执行了强制的gc动作,会把eden区的清掉,
public class MethodAreaOutOfMemory {
public static void main(String[] args) {
while(true){
Enhancer enhancer = new Enhancer();
enhancer.setSuperclass(User.class);
enhancer.setUseCache(false);
enhancer.setCallback(new MethodInterceptor() {
public Object intercept(Object arg0, Method arg1, Object[] arg2, MethodProxy arg3) throws Throwable {
return arg3.invokeSuper(arg0, arg2);
}
});
enhancer.create();
}
}
}
class User{
private String name;
private int age;
}
很快就玩完了,而且是old和eden都暴增,而用new来产生对象 old区增加很少,
-XX:+CMSClassUnloadingEnabled:设置对Perm区进行回收。
如果使用Spring/Hibernate框架大量采用cglib,导致生成的Proxy会比较多,而这些是存放在PermGen区域,SUN JDK默认情况下不会去回收,必须加上-XX:+CMSClassUnloadingEnabled -XX:+CMSPermGenSweepingEnabled参数,JDK才会去回收这部分数据。
确实加个这个条件跑起来后 ,就不会到高峰oom了
-verbose:gc -Xms20M -Xmx20M -XX:+PrintGCDetails -XX:+CMSClassUnloadingEnabled