【问题标题】:Saving PermGen space with several classloaders使用多个类加载器节省 PermGen 空间
【发布时间】:2011-12-07 22:06:35
【问题描述】:

我们正在用 Scala 编写一个包含很多类的大型 GUI 应用程序,并且我们不得不增加 PermGen 空间才能加载所有类。该应用程序本身显示了一系列基于屏幕的活动,每个活动都加载自己的大量类。在任何时间点都只加载/显示一个活动。在经历了一些活动之后,我们在 PermGen 空间中有一个OutOfMemoryError

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

所以:

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

【问题讨论】:

  • 你的 PermGen 有多大?
  • 128m 太小了,256m 暂时可以用,但能用多久?...

标签: java classloader permgen


【解决方案1】:

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

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

你的 PermGen 有多大?你可能会逃脱与 PermGen 的碰撞:

-XX:MaxPermGen=256m

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

-XX:+TraceClassLoading

这将打印出类,因为它们在 JVM 中加载到命令行。

【讨论】:

  • 感谢您的回答。看起来-XX:+TraceClassloading 在 Mac OS X 上的 JRE 版本 1.6.0_26 上不可用;有替代品吗?
  • 好的,这行得通,谢谢。我现在也使用-XX:+TraceClassUnloading
猜你喜欢
  • 2014-08-23
  • 2017-04-18
  • 2020-09-25
  • 2013-05-16
  • 1970-01-01
  • 2018-01-20
  • 1970-01-01
  • 2011-09-04
相关资源
最近更新 更多