String内存溢出异常(错误)可能的原因及解决方式
摘要:本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的产生及解决方法
第二部分:实际应用场景及解决方式參考(例如以下是server版——解压缩版本号):
|
预准备(各种环境中文件的位置) |
|
【Windows】在catalina.bat的第一行添加: set 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错误,这样的错误常见在webserver对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输入框的后面就可以)
watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvemhvbmd3ZW43NzEw/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast" alt="">
第四部分: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
例如以下图所看到的:
方法二:暂时设置对应的參数——在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
watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvemhvbmd3ZW43NzEw/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast" alt="">
參考文献:
http://blog.csdn.net/hdfyq/article/details/5856284
http://blog.csdn.net/w420372197/article/details/7878404
http://piranha.iteye.com/blog/1574040
String内存溢出异常(错误)可能的原因及解决方式的更多相关文章
- 1篇文章搞清楚8种JVM内存溢出(OOM)的原因和解决方法
前言 撸Java的同学,多多少少会碰到内存溢出(OOM)的场景,但造成OOM的原因却是多种多样. 堆溢出 这种场景最为常见,报错信息: java.lang.OutOfMemoryError: Java ...
- 如何写出让java虚拟机发生内存溢出异常OutOfMemoryError的代码
程序小白在写代码的过程中,经常会不经意间写出发生内存溢出异常的代码.很多时候这类异常如何产生的都傻傻弄不清楚,如果能故意写出让jvm发生内存溢出的代码,有时候看来也并非一件容易的事.最近通过学习< ...
- 《深入理解Java虚拟机》-----第2章 Java内存区域与内存溢出异常
2.1 概述 对于从事C.C++程序开发的开发人员来说,在内存管理领域,他们即是拥有最高权力的皇帝又是执行最基础工作的劳动人民——拥有每一个对象的“所有权”,又担负着每一个对象生命开始到终结的维护责任 ...
- JVM:Java常见内存溢出异常分析
转载自:http://www.importnew.com/14604.html Java虚拟机规范规定JVM的内存分为了好几块,比如堆,栈,程序计数器,方法区等,而Hotspot jvm的实现中,将堆 ...
- JVM高级特性与实践(一):Java内存区域 与 内存溢出异常
套用<围城>中的一句话,“墙外面的人想进去,墙里面的人想出来”,用此来形容Java与C++之间这堵内存动态分配和垃圾收集技术所围成的“围墙”就再合适不过了. 对于从事C.C++的开发人员而 ...
- 深入理解java虚拟机---->java内存区域与内存溢出异常
2. java内存区域于内存溢出异常 2.1 概述: 对于C/C++而言,内存管理具有最高的权利,既拥有每一个对象的“所有权”,又担负着每一个对象生命开始到结束的维护责任. 对于java而言,则把内存 ...
- Java内存区域与内存溢出异常(jdk 6,7,8)
运行时数据区域 Java虚拟机在执行Java程序的过程中会把它关联的内存划分为若干个不同的数据区域.这些区域都有各自的用途,以及创建和销毁的时间,有的区域随着虚拟机进程的启动而存在,有些区域则依赖用户 ...
- [深入理解JVM虚拟机]第2章-Java内存区域与内存溢出异常
2.0引-Java内存区域中,栈内存和堆内存分别装什么,为什么? 栈:解决程序的运行问题,即程序如何执行,或者说如何处理数据. 堆:解决的是数据存储的问题,即数据怎么放,放在哪儿. 参考链接https ...
- 虚拟机--第二章java内存区域与内存溢出异常--(抄书)
这是本人阅读周志明老师的<深入理解Java虚拟机>第二版抄写的,有很多省略,不适合直接阅读,需要阅读请出门左转淘宝,右转京东,支持周老师(侵权请联系删除) 第二章java内存区域与内存溢出 ...
随机推荐
- Problem E: 动物爱好者
Problem E: 动物爱好者 Time Limit: 1 Sec Memory Limit: 128 MBSubmit: 882 Solved: 699[Submit][Status][Web ...
- Spring AOP分析(3) -- CglibAopProxy实现AOP
上文探讨了应用JDK动态代理实现Spring AOP功能的方式,下面将继续探讨Spring AOP功能的另外一种实现方式 -- CGLIB. 首先,来看看类名CglibAopProxy,该类实现了两个 ...
- 解决mysql启动失败报1067错误
最近做项目使用 mysql 数据库 ,因为卸载了鲁大师造成了数据库文件缺失.重装mysql数据库后启动出现了1067错误,详情如下 在网上查了错误原因,将my.ini文件下的默认搜索引擎换成了 myi ...
- 如何编写通用的 Helper Class
Github: https://github.com/nzbin/snack-helper Docs: https://nzbin.github.io/snack-helper 前言 什么是 help ...
- maven---settings.xml配置
<?xml version="1.0" encoding="UTF-8"?> <settings xmlns="http://mav ...
- OGEngine_2.x中BitmapFont加载后黑屏问题的解决办法
在我使用OGEngine_2.x进行消灭圈圈(星星)游戏的实践的时候,使用BitmapFont对自定义字体进行调用. 原文字体教程如下:http://blog.csdn.net/OrangeGame/ ...
- 引用reference作用域scope闭包closure上下文context用法
引用(reference).作用域(scope).闭包(closure)以及上下文(context)是JavaScript重中之重的基础,也是学习好JavaScript的基础.在这里我以浅显的理解给大 ...
- [转载] Redis快速入门
转载自http://www.yiibai.com/redis/redis_quick_guide.html Redis是一个开源,先进的key-value存储,并用于构建高性能,可扩展的Web应用程序 ...
- Makefile持续学习二
Makefile概述 一.Makefile里有什么? Makefile里主要包含5个东西:显式规则.隐晦规则.变量定义.文件指示和注释 1.显式规则:显式规则说明如恶化生成一个或多的目标文件,包含要生 ...
- sql替换
select * ,replace(NewsContent,'src=','修改后的内容') as rep from News where id=337update News set NewsCont ...