我们在Scala中编写了一个包含大量类的大型GUI应用程序,我们必须增加PermGen空间才能加载所有类。应用程序本身显示了一系列基于屏幕的活动,每个活动都加载了自己的大型类。在任何时间点只加载/显示一个活动。经过几项活动后,我们在PermGen领域有一个OutOfMemoryError
。
我知道PermGen空间是garbage collected just like the rest of the heap,但我很想知道是否可以减少所需的PermGen空间。每个活动一个ClassLoader
,以便允许类卸载。
所以:
答案 0 :(得分:6)
...如果我可以减少所需的PermGen空间一 每个活动的ClassLoader,以便允许类卸载。
是的,如果使用的类加载器是垃圾收集的,则可以卸载类的唯一方法。这意味着对每个类和类加载器本身的引用必须为零。
你的PermGen有多大?你可以通过以下方式来碰撞PermGen:
-XX:MaxPermGen=256m
在您的命令行上。将其设置为512米并不罕见。如果您想要一个真正强大的解决方案,您将需要按照“活动”使用自定义类加载器的路线。为了帮助调试,还要在命令行中添加以下自解释参数:
-XX:+TraceClassLoading
这将打印出在JVM中加载到命令行的类。