繁体   English   中英

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

[英]Saving PermGen space with several classloaders

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

我理解PermGen空间是垃圾收集的,就像堆的其余部分一样 ,但是我很想知道是否可以减少每个活动一个ClassLoader所需的PermGen空间,以便允许类卸载。

所以:

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

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

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

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

-XX:MaxPermGen=256m

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

-XX:+TraceClassLoading

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM