最近我在我的Web应用程序中遇到了这个错误:
java.lang.OutOfMemoryError:PermGen空间
这是在Tomcat 6和JDK 1.6上运行的典型Hibernate/JPA + IceFaces/JSF应用程序.显然,重新部署应用程序几次后就会发生这种情况.
导致它的原因以及可以采取哪些措施来避免它?我该如何解决这个问题?
我已经安装了JDK 8并尝试运行Eclipse.我收到以下警告信息:
Java HotSpot(TM) 64-Bit Server VM warning: ignoring option MaxPermSize=512m;
support was removed in 8.0
Run Code Online (Sandbox Code Playgroud)
忽视这个论点的原因是什么?
我对Heap,Young,Tenured和Perm一代感到困惑.
有人可以解释一下吗?
根据著名本书深入浅出Java页面661:
" Garbage Collector doesn't go inside String pool."
在阅读了关于SO的类似问题后,我发现了如下混合答案:
我的问题是:
如何在Java 6及之前收集字符串文字垃圾?
因为在Java 7中,将在堆上创建字符串文字,与Java 6相比,Java 7中字符串文字的垃圾收集将如何不同?
我们在Scala中编写了一个包含大量类的大型GUI应用程序,我们必须增加PermGen空间才能加载所有类.应用程序本身显示了一系列基于屏幕的活动,每个活动都加载了自己的大型类.在任何时间点只加载/显示一个活动.经过几项活动后,我们OutOfMemoryError在PermGen领域有了一个.
我知道PermGen空间是垃圾收集的,就像堆的其余部分一样,但我很想知道是否可以减少所需的PermGen空间,例如ClassLoader每个活动一个,以便允许类卸载.
所以:
java ×4
permgen ×3
jvm ×2
classloader ×1
exception ×1
heap-memory ×1
java-6 ×1
java-8 ×1
memory-leaks ×1
string ×1