在我的项目中,我得到如下错误:
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
Sanjaya Pand.. 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
谢谢.