使用多个类加载器保存PermGen空间

时间:2011-10-14 16:42:40

标签: java classloader permgen

我们在Scala中编写了一个包含大量类的大型GUI应用程序,我们必须增加PermGen空间才能加载所有类。应用程序本身显示了一系列基于屏幕的活动,每个活动都加载了自己的大型类。在任何时间点只加载/显示一个活动。经过几项活动后,我们在PermGen领域有一个OutOfMemoryError

我知道PermGen空间是garbage collected just like the rest of the heap,但我很想知道是否可以减少所需的PermGen空间。每个活动一个ClassLoader,以便允许类卸载。

所以:

  1. 我知道系统ClassLoader加载的类无法卸载,因为它们将永远被类加载器引用。这是真的吗?
  2. 假设我的自定义类加载器不再加载类的实例,并且可以对类加载器进行垃圾回收,卸载它的类,释放PermGen空间吗?
  3. 是否有任何关于(或常见的错误会阻止)课程卸载的警告?

1 个答案:

答案 0 :(得分:6)

  

...如果我可以减少所需的PermGen空间一   每个活动的ClassLoader,以便允许类卸载。

是的,如果使用的类加载器是垃圾收集的,则可以卸载类的唯一方法。这意味着对每个类和类加载器本身的引用必须为零。

你的PermGen有多大?你可以通过以下方式来碰撞PermGen:

-XX:MaxPermGen=256m
在您的命令行上

。将其设置为512米并不罕见。如果您想要一个真正强大的解决方案,您将需要按照“活动”使用自定义类加载器的路线。为了帮助调试,还要在命令行中添加以下自解释参数:

-XX:+TraceClassLoading

这将打印出在JVM中加载到命令行的类。