omjava.lang.OutOfMemoryError: PermGen space解决方法

参考资料
1 spring java.lang.OutOfMemoryError: PermGen space
[url]http://hi.baidu.com/xjh0501/blog/item/a3d45b3b86309d28b8998f89.html[/url]
2 分析java.lang.OutOfMemoryError: PermGen space
[url]http://www.iteye.com/topic/80620[/url]
3 bea jrockit的确是个生产应用的好平台
[url]http://www.iteye.com/topic/148887[/url]
4 有兄弟使用过BEA的jrockit吗?
[url]http://www.iteye.com/topic/235203[/url]
5 Linux平台的JVM性能评测
[url]http://www.iteye.com/topic/5322[/url]

[color=red]开发环境: Tomcat7+SUN JDK1.6出现这个问题,重启后等一会就要报这个错误! :cry:
换成:Tomcat6+BEA(SUN JDK1.5)一直没问题,还是不要用太高版本了呀![/color]

引用文:
[color=blue]发现很多人把问题归因于: spring,hibernate,tomcat,因为他们动态产生类,导致JVM中的permanent heap溢出 。然后解决方法众说纷纭,有人说升级 tomcat版本到最新甚至干脆不用tomcat。还有人怀疑spring的问题,在spring论坛上讨论很激烈,因为spring在AOP时使用CBLIB会动态产生很多类。

但问题是为什么这些王牌的开源会出现同一个问题呢,那么是不是更基础的原因呢?tomcat在Q&A很隐晦的回答了这一点,我们知道这个问题,但这个问题是由一个更基础的问题产生。

于是有人对更基础的JVM做了检查,发现了问题的关键。原来SUN 的JVM把内存分了不同的区,其中一个就是permenter区用来存放用得非常多的类和类描述。本来SUN设计的时候认为这个区域在JVM启动的时候就固定了,但他没有想到现在动态会用得这么广泛。而且这个区域有特殊的垃圾收回机制,现在的问题是动态加载类到这个区域后,gc根本没办法回收!
2003年的时候就有一个bug报告给sun,但是到现在,这个bug还没有close!有人在这个bug加了句评语:“A bug this critical is open since 2003? Absolutely shameful.” 我觉得SUN在这个BUG上确实有些丢脸。对这个bug最彻底的解决办法就是不要用SUN的JDK,而改用BEA的 JRokit. 打不过,还逃不过吗? 有众多的选择,这就是开源的好。 :)[/color]

[b]总结如下[/b]:

[color=red]1 修改jvm参数[/color]

-Xms 启动应用时,JVM堆空间的初始大小值。
-Xmx 应用运行中,JVM堆空间的极限值。为了不消耗扩大JVM堆控件分配的开销,将此参数和- Xms这个两个值设为相等,考虑到需要开线程,将此值设置为总内存的80%.
-Xmn 此参数硬性规定堆空间的新生代空间大小,推荐设为堆空间大小的1/4。
永久存储区参数:
-XX:PermSize 应用服务器启动时,永久存储区的初始内存大
-XX:MaxPermSize 应用运行中,永久存储区的极限值。为了不消耗扩大JVM永久存储区分配 的开销,将此参数和-XX:PermSize这个两个值设为相等。
1G内存环境下java jvm 的参数设置参考:
JAVA_OPTS="-server -Xms800m -Xmx800m -XX:PermSize=128m -XX:MaxNewSize=256m -XX:MaxPermSize=128m -Djava.awt.headless=true "
windows下修改tomcat参数,方法一:
修改Catalina.bat文件
在“rem Execute Java with the applicable properties ”以下每行(共四处)
%_EXECJAVA% %JAVA_OPTS% %CATALINA_OPTS% %DEBUG_OPTS% -Djava.endorsed.dirs="%JA
VA_ENDORSED_DIRS%" -classpath "%CLASSPATH%" -Dcatalina.base="%CATALINA_BASE%"
-Dcatalina.home="%CATALINA_HOME%" -Djava.io.tmpdir="%CATALINA_TMPDIR%" %MAINCL
ASS% %CMD_LINE_ARGS% %ACTION%
中的%CATALINA_OPTS% 替换成-Xms800m -Xmx800m -XX:PermSize=128m -XX:MaxNewSize=256m -XX:MaxPermSize=128m

2 [color=red]对这个bug最彻底的解决办法就是不要用SUN的JDK,而改用BEA的 JRokit[/color]. :lol:
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值