在将大量数据加载到内存中时会增加permsize

时间:2014-02-06 11:14:04

标签: java memory memory-management

我一直认为,在启动JVM期间,JVM的permsize内存充满了加载类。可能还有JNI这样的东西在运行时?但总的来说,它不应该在运行期间“显着”增长。

现在我注意到,因为我将大量数据(20GB)加载到堆空间中,最大值为32GB(数据的ArrayLists),然后我得到一个'OutOfMemoryError:PermGen space'。

是否存在相关性或偶然发生?

我知道如何增加permsize。这不是问题。

2 个答案:

答案 0 :(得分:1)

使用tomcat,我为增加PermGen空间设置了以下内容。

set "JAVA_OPTS=-XX:MaxPermSize=256m"

你可能喜欢做上面这样的事情。 我设置了MB(256m),我不知道如何设置GB。

希望有所帮助。

答案 1 :(得分:1)

PermGen 内存空间不是堆的一部分(有时会导致混淆)。这是分配某种对象的地方,比如 对象,方法对象以及字符串池对象。与名称不同,此内存空间也被收集(期间) FullGC),但经常带来重大的麻烦,如已知 的的OutOfMemoryError 即可。

爆破问题PermGen很难准确诊断 因为它不是应用程序对象。大多数情况下,问题都与之相关 一大堆加载到内存中的类。一个众所周知的问题是使用 带有许多插件(WTP)的Eclipse,带有默认的JVM设置。许多类都被加载到内存中,并以permGEN的爆发结束。

PermGen的另一个问题是应用服务器中的 热部署 。由于多种原因,服务器无法释放 破坏时的上下文类。然后加载新版本的应用程序, 但旧的课程仍然存在,增加了PermGen。

这就是为什么有时我们需要重新启动整个容器,因为 PermGen