在我的项目中,我收到如下错误:
SEVERE: Servlet.service() for servlet [dispatcher] in context with path [/ExamSy stem] threw exception [javax.servlet.ServletException: java.lang.OutOfMemoryErro r: PermGen space] with root cause
java.lang.OutOfMemoryError: PermGen space
May 06, 2014 2:44:18 AM org.apache.catalina.startup.HostConfig deployWAR
INFO: Deploying web application archive /home/anything/public_html/ExamSystemold .war
May 06, 2014 2:47:08 AM org.apache.tomcat.util.digester.Digester startElement
SEVERE: Begin event threw error
java.lang.OutOfMemoryError: PermGen spaceException in thread "ContainerBackgroundProcessor[StandardEngine[Catalina]]" jav a.lang.OutOfMemoryError: PermGen space
Exception in thread "ContainerBackgroundProcessor[StandardEngine[Catalina]]" jav a.lang.OutOfMemoryError: PermGen space
答案 0 :(得分:12)
一旦遇到PermGen Space问题,您将需要查明问题是由于您的应用程序正在加载大量类还是由于内存泄漏造成的。如果是由于大量的课程,你可以微调以增加分配的PermGen空间,这将解决问题。
第一个原因可能是您的应用程序或您的服务器有太多的类,现有的PermGen Space无法容纳所有类。 ** - XX:MaxPermSize参数= XXXM ** 强>
如果问题是由于大量类导致PermGen Space不足,则可以通过添加-XX:MaxPermSize = XXm参数来增加PermGen空间。这将增加可用于存储类的空间,并且-XX:MaxPermSize = 256m -XX:+ CMSClassUnloadingEnabled
此参数指示在使用CMS GC时是否启用了类卸载。默认情况下,此参数设置为false,因此要启用此功能,您需要在java选项中显式设置以下选项。
-XX:+ CMSClassUnloadingEnabled
如果启用CMSClassUnloadingEnabled,GC也将扫描PermGen,并删除不再使用的类。仅当使用以下选项启用UseConcMarkSweepGC时,此选项才有效。
-XX:+ UseConcMarkSweepGC -XX:+ CMSPermGenSweepingEnabled
此参数指示是否启用了perm gen的扫描。默认情况下,此参数被禁用,因此需要显式设置此参数以微调PermGen问题。在Java 6中删除了此选项,因此如果您使用的是Java 6或更高版本,则需要使用-XX:+ CMSClassUnloadingEnabled。因此,为解决PermGen Space内存问题而添加的选项将类似于
-XX:MaxPermSize = 128m -XX:+ UseConcMarkSweepGC XX:+ CMSClassUnloadingEnabled 内存泄漏
第二个原因可能是内存泄漏。如何加载的类定义可能会被取消使用。
通常在Java中,类是永远的。因此,一旦加载了类,即使该应用程序在服务器上停止,它们也会保留在内存中。像cglib这样的动态类生成库使用了很多PermGen Space,因为它们动态地创建了很多类。大量使用Proxy类,它们是在运行时合成创建的。当单个类定义可以重用于多个实例时,很容易创建新的Proxy类。
Spring和Hibernate经常创建某些类的代理。这样的代理类由类加载器加载。永远不会丢弃生成的类定义,导致永久堆空间快速填满。
对于PermGen空间问题,您需要确定泄漏原因并进行修复。增加PermGen空间无济于事,只会延迟问题,因为在某些时候PermGen空间仍然会被填满。
您可以浏览此链接:http://wiki.apache.org/tomcat/MemoryLeakProtection
感谢。
答案 1 :(得分:0)
当你有PermGen空间OutOfMemoryError时,你必须检查值XX:MaxPermSize = XXXM。
永久空间是存储VM使用的类,方法,内部化字符串和类似对象,并且永远不会释放。
检查内存泄漏
从Java 8开始,permgen空间和此设置都消失了。用户不会遇到此错误。
参考文献:
答案 2 :(得分:-2)
在tomcat中设置-Xms1024M -Xmx4096M -XX:MaxPermSize=4096M
- >启动配置 - >争论,你很高兴。提到的数字只是示例,您可以使用最适合您需要的数字。