码迷,mamicode.com
首页 > 其他好文 > 详细

String内存溢出异常(错误)可能的原因及解决方案

时间:2014-07-20 22:45:43      阅读:453      评论:0      收藏:0      [点我收藏+]

标签:内存溢出   异常   解决方案   

摘要:本Blog主要为了阐述java.lang.OutOfMemoryError:PermGenspace可能产生的原因及解决方案。其中PermGen space是Permanent Generationspace的简写,表示内存的永久保存区域,这块内存主要是被JVM存放Class和Meta信息的,Class在被Loader时就会被放到PermGenspace中,它和存放类实例(Instance)的Heap区域不同,GC(Garbage Collection)不会在主程序运行期对PermGen space进行清理,所以如果你的应用中有很多CLASS的话,就很可能出现PermGen space错误。

 

内容简介:

第一部分:原理解析(为什么为出现这样的原因)

第二部分:实际应用分析及解决方案参考

第三部分:安装版的Tomcat怎样设置JAVA_OPTS

第四部分:怎样在eclipse中设置TOMCAT内存大小,解决启动时内存溢出

 

第一部分:原理解析:

1、String其实是没有限制的,而是当String太大了,超过JVM的自身的内存后会抛出java.lang.OutOfMemoryError错误,String是没有长度限制的,而是有JVM的内存限制了String的长度。同时说明,并不会抛出任何Exception而只会抛出Error。OutMemoryError表明程序的设计差,或者遇到了超出编程人员所预想的大批量的数据。

不管哪种情况,都只有下面这几种解决办法。它们是:

A、设计人员重新设计程序,不致使程序一次载入所有的数据。

B、数据可以分割成更小的块。

C、可以为程序分配更多的内存。

D、为Java虚拟机提供更多的内存。

 

2、一般都是发生在开启大型档案或跟数据库一次加载太多的数据,造成 Out Of MemoryError 的状况,这时就大概要计算一下数据量的最大值是多少,并且设定所需最小及最大的内存空间值。另一种状况平时比较难查觉。就是 Servlet 或 JSP 的 Container 突然同时上线人数爆增,也相对造成内存需求不足,所以也必须要计算出程序所需的数据量*同时上线人数,来设定内存的需求量。(如果要有最佳化的值,最好是配合 gc 做调校)

 

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

 

解决方法:

修改JAVA_OPTS="-Xms1024m-Xmx1024m" 或更大,根据系统内存情况

jsp开发中有关java.lang.OutOfMemoryError的产生及解决方法 

 

第二部分:实际应用场景及解决方案参考(如下是服务器版——解压缩版本):

预准备(各种环境中文件的位置)

Windows】在catalina.bat的第一行增加:

set JAVA_OPTS=-Xms512m -Xmx900m -XX:PermSize=128M -XX:MaxNewSize=256m -XX:MaxPermSize=256m

【非Windows】在catalina.sh的第一行增加: 
JAVA_OPTS=-Xms512m -Xmx900m -XX:PermSize=128M -XX:MaxNewSize=256m -XX:MaxPermSize=256m

 

一、java.lang.OutOfMemoryError: PermGenspace

PermGen space的全称是PermanentGeneration space,是指内存的永久保存区域,
这块内存主要是被JVM存放Class和Meta信息的,Class在被Loader时就会被放到PermGen space中,它和存放类实例(Instance)的Heap区域不同,GC(Garbage Collection)不会在主程序运行期对PermGen space进行清理,所以如果你的应用中有很多CLASS的话,就很可能出现PermGenspace错误,这种错误常见在web服务器对JSP进行precompile的时候。如果你的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 "UsingCATALINA_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 "

大家都知道,JAVA程序启动时都会JVM都会分配一个初始内存和最大内存给这个应用程序。这个初始内存和最大内存在一定程度都会影响程序的性能。比如说在应用程序用到最大内存的时候,JVM是要先去做垃圾回收的动作,释放被占用的一些内存。
          所以想调整Tomcat的启动时初始内存和最大内存就需要向JVM声明,一般的JAVA程序在运行都可以通过中-Xms -Xmx来调整应用程序的初始内存和最大内存: 
          如:java -Xms64m    -Xmx128m    a.jar.
tomcat的启动程序是包装过的,不能直接使用java -X..... tomcat.*来改变内存的设置。

在Tomcat在改变这个设置有两种方法:
1.     
就需要在环境变量中加上TOMCAT_OPTS, CATALINA_OPTS两个属性,
          如 SET    CATALINA_OPTS= -Xms64m -Xmx512m;
          ms是最小的,mx是最大,64m, 512m分别是指内存的容量.

2.      修改Catalina.bat文件
         在166行“rem Execute Java with the applicable properties ”以下每行
%_EXECJAVA% %JAVA_OPTS% %CATALINA_OPTS% %DEBUG_OPTS%-Djava.endorsed.dirs="%JAVA_ENDORSED_DIRS%" -classpath"%CLASSPATH%" -Dcatalina.base="%CATALINA_BASE%"-Dcatalina.home="%CATALINA_HOME%"-Djava.io.tmpdir="%CATALINA_TMPDIR%" %MAINCLASS% %CMD_LINE_ARGS%%ACTION% 中的%CATALINA_OPTS% 替换成-Xms64m-Xmx512m

 

 

第三部分:如果是安装版的tomcat怎样设置JAVA_OPTS

JAVA_OPTS="-Xms128M-Xmx512M -XX:PermSize=128M -XX:MaxPermSize=512M"

tomcat如果是通过windows服务启动,执行的是bin\tomcat.exe.他读取注册表中的值,而不是catalina.bat的设置.
解决办法:
修改注册表HKEY_LOCAL_MACHINE\SOFTWARE\Apache Software Foundation\Procrun2.0\Tomcat6\Parameters\JavaOptions
原值为
-Dcatalina.home=E:\Tomcat 6.0
-Dcatalina.base=E:\Tomcat 6.0
-Djava.endorsed.dirs=E:\Tomcat 6.0\common\endorsed
-Djava.io.tmpdir=E:\Tomcat 6.0\temp
-Djava.util.logging.manager=org.apache.juli.ClassLoaderLogManager

-Djava.util.logging.config.file=E:\Tomcat6.0\conf\logging.properties

在后面增加即可:

-Xms128M

-Xmx512M

-XX:PermSize=128M

-XX:MaxPermSize=512M

必须要分行写。

最终效果如下:(细节注解:将相应的信息加入Java Options输入框的后面即可)

bubuko.com,布布扣

第四部分:eclipse中设置TOMCAT内存大小,解决启动时内存溢出

有时在ECLIPSE中启动TOMCAT会出现内存溢出和转换错误等莫名奇妙的错误,这些很有可能是内存不够引起的,这时可以在设置中找到Server然后找到Tomcat找到对应的版本。

 

方法一:永久设置JVM相应的参数值:

通过Windows下的Preferences找到Tomcat中的JVM Settings中的Append to JVMParameters进行相应的参数设置:

-Xms128m -Xmx512m  -XX:PermSize=256M-XX:MaxNewSize=128m -XX:MaxPermSize=512m

如下图所示:

bubuko.com,布布扣

方法二:临时设置相应的参数——在eclipse中进行如下步骤设置:

1、点击eclipse上的debug图标旁边的下拉箭头

2、然后选择Debug  Configurations,

3、系统弹出设置tomcat配置页面,在Argument中末尾添加参数中的VM arguments中追加:

-Xms256M-Xmx512M -XX:PermSize=256m -XX:MaxPermSize=512m

参数的意思
-vmargs:说明后面是VM的参数
-Xms40m:虚拟机占用系统的最小内存
-Xmx256m:虚拟机占用系统的最大内存
-XX:PermSize:最小栈内存大小。一般报内存不足时,都是说这个太小,堆空间剩余小于5%就会警告,建议把这个稍微设大一点,不过要视自己机器内存大小来设置
-XX:MaxPermSize:最大栈内存大小。这个也适当大些
-Xmx512M的5%为25.6M,理论上要求-Xmx的数值与-XX:MaxPermSize必须大于25.6M

bubuko.com,布布扣

参考文献:

http://blog.csdn.net/hdfyq/article/details/5856284

http://blog.csdn.net/w420372197/article/details/7878404

http://piranha.iteye.com/blog/1574040

http://116.255.173.144/?c=article&a=read&id=59498

http://my.oschina.net/colorleaf/blog/175581

String内存溢出异常(错误)可能的原因及解决方案

标签:内存溢出   异常   解决方案   

原文地址:http://blog.csdn.net/zhongwen7710/article/details/37997521

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!