java.lang.OutOfMemoryError: PermGen space及其解决方法--

开发者福利!热门AI工具限时免费用 购周边即赠Coding Plan Lite,Claude Code、Cursor等20+工具畅享,效率翻倍! 阅读详情

一. 问题描述

JBoss 4.0.5GA 在若干次部署或重新部署应用程序(war、ear 等)后会马上出现 PermGen Memory Leak : Out of memory exception 内存溢出异常。

PermGen space的全称是Permanent Generation space,是指内存的永久保存区域OutOfMemoryError: PermGen space从表面上看就是内存益出,解决方法也一定是加大内存。说说为什么会内存益出:这一部分用于存放Class和Meta的信息,Class在被 Load的时候被放入PermGen space区域,它和和存放Instance的Heap区域不同,GC(Garbage Collection)不会在主程序运行期对PermGen space进行清理,所以如果你的APP会LOAD很多CLASS的话,就很可能出现PermGen space错误。这种错误常见在web 服务器对JSP进行pre compile的时候。

参阅:http://wiki.jboss.org/wiki/Wiki.jsp?page=OutOfMemoryExceptionWhenRedeploying

二. 问题分析

1. 猜测:应用程序的类中包括了 static 成员定义,当重新部署时 JBoss 使用新的 Class Loader 载入应用程序的所有类。由于 static 成员是置于 JBoss 的固定内存单元,多次部署后占用内存空间以倍数递增,最终使该部分内存满载,进而在下一次部署或重新部署时导致内存溢出异常。

参阅:http://jboss.org/index.html?module=bb&op=viewtopic&p=3918780

讨论标题:Multiple redeployment gets PermGen error

The permanent generation holds class-level data (that is, any fields defined as static). My guess that your classes contain static data, and when you redeploy, the redeployed classes are loaded by a new class loader and thus the static data from the old classes and the new classes are now taking up room. Do this several times and the permanent generation will fill up. If my guess is correct, the solution would be to modify your code to not use static data in any of your classes. Of course you should also check any class libraries on which your code depends (jar files you package with your ear) for the same thing. But then I could be wrong.

2. 在 Bug 2299 报告的讨论中,涉及到关于 Struts 框架中引用了 BeanUtils 1.6 的讨论。

一、java .lang.OutOfMemoryError: PermGen space

PermGen space的全称是Permanent Generation space,是指内存的永久保存区域,
这块内存主要是被JVM存放Class和Meta信息的,Class在被Loader时就会被放到PermGen space中,
它和存放类实例(Instance)的Heap区域不同,GC(Garbage Collection)不会在主程序运行期对
PermGen space进行清理,所以如果你的应用中有很多CLASS的话,就很可能出现PermGen space错误,
这种错误常见在web服务器对JSP进行pre compile的时候。如果你的WEB APP下都用了大量的第三方jar, 其大小
超过了jvm默认的大小(4M)那么就会产生此错误信息了。
解决方法: 手动设置MaxPermSize大小

修改TOMCAT_HOME/bin/catalina.sh
在“echo "Using CATALINA_BASE:   $CATALINA_BASE"”上面加入以下行:
JAVA_OPTS="-server -XX:PermSize=64M -XX:MaxPermSize=128m
建议:将相同的第三方jar文件移置到tomcat/shared/lib目录下,这样可以达到减少jar 文档重复占用内存的目的。

二、java.lang.OutOfMemoryError: Java heap space
Heap size 设置
JVM堆的设置是指java程序运行过程中JVM可以调配使用的内存空间的设置.JVM在启动的时候会自动设置Heap size的值,
其初始空间(即-Xms)是物理内存的1/64,最大空间(-Xmx)是物理内存的1/4。可以利用JVM提供的-Xmn -Xms -Xmx等选项可
进行设置。Heap size 的大小是Young Generation 和Tenured Generaion 之和。
提示:在JVM中如果98%的时间是用于GC且可用的Heap size 不足2%的时候将抛出此异常信息。
提示:Heap Size 最大不要超过可用物理内存的80%,一般的要将-Xms和-Xmx选项设置为相同,而-Xmn为1/4的-Xmx值。
解决方法:手动设置Heap size
修改TOMCAT_HOME/bin/catalina.sh
在“echo "Using CATALINA_BASE:   $CATALINA_BASE"”上面加入以下行:
JAVA_OPTS="-server -Xms800m -Xmx800m   -XX:MaxNewSize=256m"


三. 参阅

1. 相关 Bug 报告:

1)Bug 1319

http://jira.jboss.com/jira/browse/JBAS-1319
(声称到 4.0.3RC1 已解决)

2)Bug 2299

http://jira.jboss.com/jira/browse/JBAS-2299
(声称到 4.2.0 才会解决)

2. 关于 Permanent Generation Heap 的概念以及如何在 JVM 启动命令行中添加重新定义 PermSize 和 MaxPermSize 的参数:

http://wiki.jboss.org/wiki/Wiki.jsp?page=PermanentGeneration

3. 关于如何查看 JBoss 内存使用状况的操作指引:

http://wiki.jboss.org/wiki/Wiki.jsp?page=HowCanIDisplayTheMemoryPoolUsage

1)打开http://server-name-or-ip/jmx-console/HtmlAdaptor
2)在 jboss.system 节点找到 type=ServerInfo ,点击进入
3)找到 java.lang.String listMemoryPools() 方法,点击 Invoke 按钮执行

PermGen 内存状况在最下面一行,当已使用的内存数量逼近最大可用内存限制时应考虑重启 JBoss 。

四. 建议

在可能的条件下使用更稳定但不是免费的 IBM Websphere Application Server 代替 JBoss Application Server 。根据外间性能评测,这两者在性能上比较接近。

性能评测参阅:http://www.**ing.com/html/27/1132.html

但如果应用程序是在正式运营期间,由于可能的重新部署情况比开发和测试阶段少很多,因此不需过多担心。 使用以下方案可减少或避免内存溢出异常的出现:

1. 部署或重新部署应用程序后通过 jmx-console 检查内存占用状况,在 PermGen Size 逼近限制值时及时重启 JBoss AS 。

2. 增大 PermSize 和 MaxPermSize (不建议使用相同的值)。

对于LINUX只能修改MaxPermSize

-XX:MaxPermSize=256m/512m

 

 

 

转http://space.itpub.net/8570952/viewspace-330990

java.lang.OutOfMemoryError: PermGen space解决方法 最近接触一个大项目,更新完,配置好数据源启动。启动半天一开始启动成功,但是访问地址页面一直转圈,最后报404,因为启动没发现报错,就又启动了几回,发现后台报了个这个错误:java.lang.OutOfMemoryError: PermGen space 错误原因介绍: PermGen space的全称是Permanent Generation space,是指内存的永久保存区域OutOfM... 阅读详情

相关推荐

CAN XL和10Base-T1S全对比:在区域架构中如何选择最适合的车载通信协议?

本文深入对比了CAN XL和10Base-T1S在车载网络架构中的性能差异,通过实测数据和典型应用场景分析,为区域架构设计提供选型指南。重点探讨了带宽、延迟、成本等关键指标,帮助工程师在ADAS传感器部署和车身控制网络优化中做出明智选择。

pear55的博客 566

Java内存不足之PermGen space错误探究

Java内存不足之PermGen space错误探究

JEECG官方博客 2225

产业大脑+未来工厂:揭秘浙江数字经济系统的5大核心场景搭建指南

本文深入解析了“产业大脑+未来工厂”这一浙江数字经济系统的核心范式,并提供了五大核心场景的实战搭建指南。文章详细阐述了从供应链协同、产能共享到产品创新、质量追溯及绿色低碳等关键场景的构建逻辑与技术架构,旨在帮助企业实现从技术驱动到场景驱动的价值落地,破解数据孤岛难题,提升产业链整体效能。

mac99的博客 641

报错Java.Lang.OutOfMemoryError: PermGen Space三种解决办法

原因:当Java虚拟机需要加载定义的一个新class,但是在持久代中没有足够的空间就会抛出‘Java.Lang.OutOfMemoryError: PermGen Space’异常。 默认分配给持久代的大小在server模式下是64MB ,在client模式下是32MB方法1: 在ide中启动项目的时候在debug Configurations的Vm arguments参数设置中 添加-Xms5...

sumengnan的博客 2147

OutOfMemoryError:PermGen space

java.lang.OutOfMemoryError: PermGen spaces是指永久区内存溢出的错误,这个错误在java项目中十分常见。

leo187的博客 1万+

java.lang.OutOfMemoryError: PermGen space及其解决方法

PermGen space的全称是Permanent Generation space,是指内存的永久保存区域OutOfMemoryError: PermGen space从表面上看就是内存益出,解决方法也一定是加大内存。说说为什么会内存益出:这一部分用于存放Class和Meta的信息,Class在被 Load的时候被放入PermGen space区域,它和和存放Instance的Heap

z507263441的专栏 1609

java.lang.OutOfMemoryError: PermGen space基于idea,MyEclipse或tomcat的详细解决方法以及详解JVM配置参数

java.lang.OutOfMemoryError: PermGen space基于idea,MyEclipse,eclipse或tomcat的详细解决方法以及详解JVM配置参数,比如-Xms -Xmx -XX:PermSize -XX:MaxNewSize -XX:MaxPermSize

念兮为美 2417

eclipse运行报java.lang.OutOfMemoryError: PermGen space解决方法

一、在window下eclipse里面Server挂的是tomcat6,一开始还是以为,tomcat配置的问题,后面发现,配置了tomcat里面的catalina.bat文件,加入  set JAVA_OPTS=-Xms512m -Xmx1024m -XX:PermSize=256M -XX:MaxNewSize=108m -XX:MaxPermSize=512m  ,eclipse跑起来还是

执着,也是一种态度 223

IDEA报错:java.lang.OutOfMemoryError: PermGen space解决方法

目录 1.背景 2.解决方法 1.背景 idea运行Tomcat经常会报错:java.lang.OutOfMemoryError: PermGen space(内存溢出)。 2.解决方法 增加配置 -Xms128m -Xmx1024m -XX:MaxPermSize=512m 如图所示: 注:512m根据自己电脑内存大小,自由调整大小。 重启Tomcat ...

weixin_40461030的博客 4291

出现 java.lang.OutOfMemoryError: PermGen space 错误的原因及解决方法

一、原因及解决方法[1] 1、原因:堆内存的永久保存去区内存分配不足(缺省默认为64M),导致内存溢出错误。 2、解决方法:重新分配内存大小,-Xms1024M -Xmx2048M -XX:PermSize=128M -XX:MaxPermSize=256M 3、步骤:[3] -Xms256m -Xmx512m -XX:PermSize=256m -XX:MaxPermSize=256...

ryelqy的博客 2万+

eclipse中出现java.lang.OutOfMemoryError: PermGen space解决方法

eclipse中出现java.lang.OutOfMemoryError: PermGen space解决方法:将Default VM arguments参数加上该参数值:-server -XX:PermSize=1G -XX:MaxPermSize=1G操作步骤: Window->Preferences->java->Installed JREs ->选择eclipse中使用的JDK->Edit

u010725501的专栏 497

内存泄露java.lang.OutOfMemoryError: PermGen space解决方法

内存泄露Java.lang.OutOfMemoryError: PermGen space解决办法 今天访问web服务器,点击几个网页,tomcat服务就瘫痪了,通过查看日志,发现java.lang.OutOfMemoryError: PermGen space错误,如下 Mar 6, 2010 3:27:06 PM org.apache.coyote.http11.Http11Prot...

lgxzzz的博客 2354

eclipse 运行报java.lang.OutOfMemoryError: PermGen space解决方法

windows 环境下,eclipse 部署一个项目 启动没问题,部署两个项目时候报java.lang.OutOfMemoryError: PermGen space错误 。 修改catalina.bat 文件 set JAVA_OPTS=-Xms512m -Xmx1024m -XX:PermSize=256M -XX:MaxNewSize=108m -XX:MaxPermSize=512m...

yechangfeng47的博客 204

Tomcat java.lang.OutOfMemoryError: PermGen space及其解决方法

今天Tomcat服务器突然挂掉了,报出了"java.lang.OutOfMemoryError: PermGen space"。重新启动再部署项目前几次好用,但过几次又出现了这个异常。 PermGen space是什么?  PermGen space的全称是Permanent Generation space,是指内存的永久保存区域OutOfMemoryError: PermGen space

coding 1863

java perm space_java.lang.OutOfMemoryError: PermGen space及其解决方法

PermGen space的全称是Permanent Generation space,是指内存的永久保存区域OutOfMemoryError: PermGen space从表面上看就是内存益出,解决方法也一定是加大内存。说说为什么会内存益出:这一部分用于存放Class和Meta的信息,Class在被 Load的时候被放入PermGenspace区域,它和和存放Instance的Heap区域不同,...

weixin_33837516的博客 721

java.lang.OutOfMemoryError: PermGen space有效解决方法

转自:https://blog.csdn.net/yufang131/article/details/80747564 PermGen space的全称是Permanent Generation space,是指内存的永久保存区域OutOfMemoryError: PermGen space从表面上看就是内存益出,解决方法也一定是加大内存。说说为什么会内存益出:这一部分用于存放Class和Meta的信息,Class在被 Load的时候被放入PermGen space区域,它和和存放Instance的Hea

qq_47759220的博客 358

java permgen space_java.lang.OutOfMemoryError: PermGen space有效解决方法

PermGen space的全称是Permanent Generation space,是指内存的永久保存区域OutOfMemoryError: PermGen space从表面上看就是内存益出,解决方法也一定是加大内存。说说为什么会内存益出:这一部分用于存放Class和Meta的信息,Class在被 Load的时候被放入PermGen space区域,它和和存放Instance的Heap区域不同...

weixin_39963053的博客 91
下一篇: JS 页面加载慢 的问题分析---转
liumuqi657
博客等级 码龄17年 0粉丝 0原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值