错误java.lang.OutOfMemoryError:PermGen空间

 淘美国 发布于 2023-01-16 15:42

在我的项目中,我得到如下错误:

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

谢谢.

撰写答案
今天,你开发时遇到什么问题呢?
立即提问
热门标签
PHP1.CN | 中国最专业的PHP中文社区 | PNG素材下载 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有