0

我们有一个应用程序可以生成数千个 Java 类加载器和类,然后再让它们被垃圾回收。我们很确定没有类加载器泄漏,但是我们得到了 permgen 错误(即使有,这个问题也与任何潜在的泄漏正交)。

有没有办法指定某些 ClassLoader 及其加载的类放在堆中而不是 perm gen 中?

我们在 Linux 上使用 Oracle JDK Java 6。


编辑:看起来 Java 8 将不再有 PermGen。它将被元空间取代。

http://java.dzone.com/articles/java-8-permgen-metaspace

4

2 回答 2

2

当然,您会遇到 perm gen 错误——这是类加载器放置类的地方。你会期待什么?

您可以将它们映射到字节缓冲区,就像 Java NIO 所做的那样,但它们不会放在堆上。

在采取特殊措施之前,您应该尝试增加您的烫发大小。您需要多少烫发空间?使用 Visual VM 对其进行分析并查看。

于 2013-03-20T21:57:23.930 回答
1

有没有办法指定某些 ClassLoader 及其加载的类放在堆中而不是 perm gen 中?

AFAIK,没有办法做到这一点。AFAIK,permgen 分配发生在 JVM 运行时的深处,你无法做到这一点。(我不认为类加载器本身在 permgen 中。我认为它只是代表类及其代码的 JVM 的内部数据结构。)

如果您的应用程序真的必须以这种方式工作,我认为您别无选择,只能使 permgen 足够大。(显然,您应该检查真正的问题不是 permgen 泄漏。)

然而,如果你的应用程序需要生成大量的类和类加载器,我觉得它的架构相当奇怪。我会看看它正在做的事情是否不能以其他方式完成。

于 2013-03-20T22:46:47.933 回答