`
sony-soft
  • 浏览: 1021427 次
文章分类
社区版块
存档分类
最新评论

java.lang.OutOfMemoryError原因分析——让代码茁壮成长

 
阅读更多

让代码茁壮成长
版权声明:转载时请以超链接形式标明文章原始出处和作者信息及本声明
http://maliangsblog.blogbus.com/logs/29154791.html

这几天有些焦头烂额,上个星期就一直被OutOfMemoryError纠缠,所以更改了数据的导入策略,来减少在内存中驻留的数据。但是新的OutOfMemoryError又出现了,而且出现的地方更邪门。原来Error是出现在导入工作即将完成的情况下,现在Error出现的更早了,个人觉得大为诡异。难道分块处理数据会更耗用内存吗?

在网上胡乱投医的时候,看见网友这样写道:“导致java.lang.OutOfMemoryError的根本原因是程序不健壮。因此,从根本上解决Java内存溢出的唯一方法就是修改程序,及时地释放没用的对象,释放内存空间。”佩服这位网友的勇气、韧性和认真。

要让自己的代码茁壮成长。

附上一些关于OutOfMemoryError的资料:

1.String其实是没有限制的,而是当String太大了,超过JVM的自身的内存后会抛出java.lang.OutOfMemoryError错误

String是没有长度限制的,而是有JVM的内存限制了String的长度。同时说明,并不会抛出任何Exception而只会抛出Error.
OutMemoryError表明程序的设计差,或者遇到了超出编程人员所预想的大批量的数据。

不管哪种情况,都只有下面这几种解决办法。它们是:
设计人员重新设计程序,不致使程序一次载入所有的数据。
数据可以分割成更小的块。
可以为程序分配更多的内存
为Java虚拟机提供更多的内存

2.一般都是发生在开启大型档案或跟数据库一次拿了太多的数据,造成 Out Of Memory Error 的状况,这时就大概要计算一下数据量的最大值是多少,并且设定所需最小及最大的内存空间值。

另一种状况平时比较难查觉。就是 Servlet 或 JSP 的 Container 突然同时上线人数爆增,也相对造成内存需求不足,所以也必须要计算出程序所需的数据量*同时上线人数,来设定内存的需求量。(如果要有最佳化的值,最好是配合 gc 做调校)


有一种说法是听来的,实际上是不是如此还有待确认。


当 CPU 速度愈快,内存的最小需求量也就必需愈大。原因是 CPU 愈快,短时间内能处理的数据量也就愈大,所以在 java 做 GC 之前,可能已经内存已经消耗完了,所以 CPU 的速度也是内存初始需求量的重要因素之一。


目前这三项应该足以应付绝大部份 Out Of Memory Error 的状况,其它造成 Out Of Memory Error 的状况,等有遇到再来补充。

方法:
修改JAVA_OPTS="-Xms1024m -Xmx1024m" 或更大,根据系统内存情况
内存溢出的情况很大可能性是程序设计过程中不注意消耗内存的细节编码造成的。
但是编码后期来发现问题需要付出的劳动会很多,很不容易 。

http://www.matrix.org.cn/resource/article/43/43639_Memory_Leaks.html
http://www.pconline.com.cn/pcedu/empolder/gj/java/0509/699218.html

有关java内存的文章和内存溢出查找原因的一个方法。
=====================================================
jsp开发中有关java.lang.OutOfMemoryError的产生及解决方法
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
作者:淘特网
出处:淘特网
注:转载请注明出处
这里以tomcat环境为例,其它WEB服务器如jboss,weblogic等是同一个道理。


一、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"

三、实例,以下给出1G内存环境下java jvm 的参数设置参考:

JAVA_OPTS="-server -Xms800m -Xmx800m -XX:PermSize=64M -XX:MaxNewSize=256m -XX:MaxPermSize=128m -Djava.awt.headless=true "

题外话:经常看到网友抱怨tomcat的性能不如...,不稳定等,其实根据笔者几年的经验,从"互联星空“到现在的房产门户网,我们
均使用tomcat作为WEB服务器,每天访问量百万多,tomcat仍然运行良好。建议大家有问题多从自己程序入手,多看看java的DOC文档
并详细了解JVM的知识。这样开发的程序才会健壮。

分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics