java常见内存溢出异常分析-java开发java经验技巧

java常见内存溢出异常分析-java开发java经验技巧

ID:31292768

大小:74.00 KB

页数:4页

时间:2019-01-08

java常见内存溢出异常分析-java开发java经验技巧_第1页
java常见内存溢出异常分析-java开发java经验技巧_第2页
java常见内存溢出异常分析-java开发java经验技巧_第3页
java常见内存溢出异常分析-java开发java经验技巧_第4页
资源描述:

《java常见内存溢出异常分析-java开发java经验技巧》由会员上传分享,免费在线阅读,更多相关内容在工程资料-天天文库

1、Java常见内存溢出异常分析-编程开发技术Java常见内存溢出异常分析原文出处:imtigerJava虚拟机规范规定JVM的内存分为了好几块,比如堆,栈,程序计数器,方法区等,而Hotspotjvin的实现中,将堆内存分为了三部分,新生代,老年代,持久带,其屮持久带实现了规范屮规定的方法区,而内存模型屮不同的部分都会出现相应的00M错误,接下来我们就分开来讨论一下。栈溢出(StackOverflowError)栈溢出抛出java.lang.StackOverflowError错谋,出现此种情况是因为方法运行的时候栈的深度超过了虚拟机容许的最大深度所致。岀现这种情况,一般情况下是程序错

2、误所致的,比如写了一个死递归,就有可能造成此种情况。下面我们通过一段代码来模拟一下此种情况的内存溢出。importjava.util.*;importjava・lang・*;publicclassOOMTest{publicvoidstackOverFlowMethod(){stackOverFlowMethod();}publicstaticvoidmain(String...args){OOMTestoom=newOOMTest();oom.stackOverFlowMethod();}}运行上面的代码,会抛出如下的异常:Exceptioninthread"mairTjava.l

3、ang.StackOverflowErroratOOMTest.stackOverFlowMethod(OOMTest.java:6)堆溢出(OutOfMemoryError:javaheapspace)堆内存溢出的时候,虚拟机会抛出java.lang.OutOfMcmoryError:javaheapspace,出现此种情况的时候,我们需要根据内存溢出的时候产生的dump文件来具体分析(需要增加-XX:+HeapDumpOnOutOfMemoryErrorjvm启动参数)。出现此种问题的吋候有可能是内存泄露,也有可能是内存溢出了。如果内存泄霜,我们要找出泄露的对象是怎么被GCROO

4、T引用起來,然后通过引用链来貝体分析泄露的原因。如果出现了内存溢出问题,这往往是程序本生需要的内存大于了我们给熄拟机配置的内存,这种情况下,我们可以采用调大-Xmx来解决这种问题。下面我们通过如下的代码来演示一下此种情况的溢岀:importjava,util.*;importjava.lemg.*;publicclassOOMTest{publicstaticvoidmain(String...args){Listbuffer二newArrayList();buffer,add(newbyte[10*1024*1024]);我们通过如下的命令运行上面的

5、代码:java-verbose:gc-XmnlOM-Xms20M-Xmx20M-XX:+PrintGCOOMTcst程序输入如下的信息:[GC1180K->366K(19456K),0.0037311secs][FullGC366K->330K(19456K),0.0098740secs][FullGC330K->292K(19456K),0.0090244secs]Exceptioninthread"main"java.lang.0utOfMcmoryError:JavaheapspaceatOOMTest.main(OOMTest.java:7)从运行结果可以看出,JVM进行了一

6、次Minorgc和两次的Majorgc,从Majorgc的输岀可以看岀,gc以后old区使用率为134K,而字节数组为10M,加起来大于了oldgeneration的空间,所以抛出了异常,如果调整-Xms21M,-Xmx21M,那么就不会触发gc操作也不会岀现异常了。通过上而的实验英实也从侧而验证了一个结论:当对象大于新生代剩余内存的时候,将直接放入老年代,当老年代剩余内存还是无法放下的时候,出发垃圾收集,收集后还是不能放下就会抛出内存溢出异常了持久带溢出(OutOfMemoryError:PermGenspace)我们知道Hotspotjvm通过持久带实现了Jewel虚拟机规范中的

7、方法区,而运行时的常量池就是保存在方法区屮的,因此持久带溢出冇可能是运行时常量池溢出,也有可能是方法区中保存的class对彖没有被及时冋收掉或者class信息占用的内存超过了我们配置。当持久带溢出的吋候抛出java,lemg.OutOfMemoryError:PermGenspace。我在工作可能在如卜•几种场景卜•出现此问题。1.使用一些应用服务器的热部署的时候,我们就会遇到热部署几次以麻发现内存溢出了,这种情况就是因为每次热部署的后,原來的class没

当前文档最多预览五页,下载文档查看全文

此文档下载收益归作者所有

当前文档最多预览五页,下载文档查看全文
温馨提示:
1. 部分包含数学公式或PPT动画的文件,查看预览时可能会显示错乱或异常,文件下载后无此问题,请放心下载。
2. 本文档由用户上传,版权归属用户,天天文库负责整理代发布。如果您对本文档版权有争议请及时联系客服。
3. 下载前请仔细阅读文档内容,确认文档内容符合您的需求后进行下载,若出现内容与标题不符可向本站投诉处理。
4. 下载文档时可能由于网络波动等原因无法下载或下载错误,付费完成后未能成功下载的用户请联系客服处理。