我们有一个应用程序可以生成数千个 Java 类加载器和类,然后再让它们被垃圾回收。我们很确定没有类加载器泄漏,但是我们得到了 permgen 错误(即使有,这个问题也与任何潜在的泄漏正交)。
有没有办法指定某些 ClassLoader 及其加载的类放在堆中而不是 perm gen 中?
我们在 Linux 上使用 Oracle JDK Java 6。
编辑:看起来 Java 8 将不再有 PermGen。它将被元空间取代。
我们有一个应用程序可以生成数千个 Java 类加载器和类,然后再让它们被垃圾回收。我们很确定没有类加载器泄漏,但是我们得到了 permgen 错误(即使有,这个问题也与任何潜在的泄漏正交)。
有没有办法指定某些 ClassLoader 及其加载的类放在堆中而不是 perm gen 中?
我们在 Linux 上使用 Oracle JDK Java 6。
编辑:看起来 Java 8 将不再有 PermGen。它将被元空间取代。
当然,您会遇到 perm gen 错误——这是类加载器放置类的地方。你会期待什么?
您可以将它们映射到字节缓冲区,就像 Java NIO 所做的那样,但它们不会放在堆上。
在采取特殊措施之前,您应该尝试增加您的烫发大小。您需要多少烫发空间?使用 Visual VM 对其进行分析并查看。
有没有办法指定某些 ClassLoader 及其加载的类放在堆中而不是 perm gen 中?
AFAIK,没有办法做到这一点。AFAIK,permgen 分配发生在 JVM 运行时的深处,你无法做到这一点。(我不认为类加载器本身在 permgen 中。我认为它只是代表类及其代码的 JVM 的内部数据结构。)
如果您的应用程序真的必须以这种方式工作,我认为您别无选择,只能使 permgen 足够大。(显然,您还应该检查真正的问题不是 permgen 泄漏。)
然而,如果你的应用程序需要生成大量的类和类加载器,我觉得它的架构相当奇怪。我会看看它正在做的事情是否不能以其他方式完成。