Java 在将大量数据加载到内存中时,不断增大的permsize

Java 在将大量数据加载到内存中时,不断增大的permsize,java,memory,memory-management,Java,Memory,Memory Management,我一直认为,JVM的permsize内存在启动JVM时充满了加载类。可能在运行时也使用JNI之类的东西?但一般来说,它不应该在运行时“显著”增长 现在我注意到,由于我将大量数据(20GB)加载到heapspace中,最大值为32GB(数据数组列表),因此我得到了一个“OutOfMemoryError:PermGen空间” 是否存在相关性或只是偶然 我知道如何增加烫发量。这不是问题。对于tomcat,我为增加永久空间设置了以下内容 set "JAVA_OPTS=-XX:MaxPermSize=25

我一直认为,JVM的permsize内存在启动JVM时充满了加载类。可能在运行时也使用JNI之类的东西?但一般来说,它不应该在运行时“显著”增长

现在我注意到,由于我将大量数据(20GB)加载到heapspace中,最大值为32GB(数据数组列表),因此我得到了一个“OutOfMemoryError:PermGen空间”

是否存在相关性或只是偶然


我知道如何增加烫发量。这不是问题。

对于tomcat,我为增加永久空间设置了以下内容

set "JAVA_OPTS=-XX:MaxPermSize=256m"
你可能喜欢做上面的事情。 我已经设置了MB(256m),我不知道如何设置GB


希望有帮助。

PermGen内存空间不是堆的一部分(有时这会导致混乱)。它是分配某种对象的地方,比如 对象、方法对象以及字符串池对象。与名称不同,此内存空间也会被收集(在 但通常会带来严重的头痛,众所周知 OutOfMemoryError

骨膜破裂的问题很难精确诊断 因为它不是应用程序对象。大多数情况下,问题都与 加载到内存中的类数量过多。一个众所周知的问题是使用 Eclipse的许多插件(WTP)都有默认的JVM设置。许多类被加载到内存中,并以一个永久性的爆发结束

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


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

是一个带有热部署JSP的webapp吗?当像Tomcat这样的servlet容器编译JSP时,这是PermGen中的一个全新类,但旧的JSP类不一定会被删除。@Stewart。谢谢。这是一个很好的解释,很好的了解。但是我的Servlet没有JSP,它只是一个Servlet。我建议尝试使用JVM内存分析器。随着PermGen的增长,它可能会告诉您PermGen中的类是什么。我知道如何设置permsize。这不是问题所在。我想了解为什么permsize在运行时会增长,以及是否与我描述的效果相关。非常感谢您的解释。因此,达到maxpermsize的限制不会(或者应该)触发一个完整的GC。我认为它应该触发。但也许,出于某种原因,即使是gc也无法缩小permGem。像jvisualvm这样的概要文件工具可以显示permGem内部发生的事情。