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