我们正在用 Scala 编写一个带有很多类的大型 GUI 应用程序,我们不得不增加 PermGen 空间才能加载所有类。该应用程序本身显示了一系列基于屏幕的活动,每个活动都加载自己的大量类。在任何时间点都只加载/显示一个活动。在经历了一些活动之后,我们OutOfMemoryError
在 PermGen 空间有了一个。
我知道 PermGen 空间就像堆的其余部分一样被垃圾收集,但我很想看看我是否可以通过每个活动一个来减少所需的 PermGen 空间,ClassLoader
以便允许类卸载。
所以:
- 我知道系统 ClassLoader 加载的类无法卸载,因为它们的类加载器将永远引用它们。真的吗?
- 如果我的自定义类加载器加载的类的实例不再存在,并且类加载器可以被垃圾收集,它的类是否会被卸载,从而释放 PermGen 空间?
- 是否有任何关于(或会阻止)类卸载的警告?