将java ClassLoaders添加到堆而不是perm gen

时间:2013-03-20 21:54:54

标签: java memory-management permgen

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

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

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


编辑:看起来Java 8将不再拥有PermGen。它将被Metaspace取代。

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

2 个答案:

答案 0 :(得分:2)

当然你得到的是perm gen错误 - 这就是类加载器放置类的地方。你会期待什么?

你可以将它们映射到字节缓冲区,就像Java NIO那样,但是它们不会在堆上。

在采取特殊措施之前,你应该尝试增加你的烫发规模。你需要多少烫发空间?使用Visual VM对其进行配置并查看。

答案 1 :(得分:1)

  

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

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

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

但是,如果需要生成大量的类和类加载器,那么应​​用程序的体系结构就很奇怪了。我想看看它做的是不是可以用另一种方式做。