﻿<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/"><channel><title>BlogJava-我的博客-随笔分类-JVM</title><link>http://www.blogjava.net/qbna350816/category/55092.html</link><description>201103</description><language>zh-cn</language><lastBuildDate>Tue, 26 Jul 2016 16:09:17 GMT</lastBuildDate><pubDate>Tue, 26 Jul 2016 16:09:17 GMT</pubDate><ttl>60</ttl><item><title>常见的内存溢出的三种情况</title><link>http://www.blogjava.net/qbna350816/archive/2016/07/26/431337.html</link><dc:creator>胡小军</dc:creator><author>胡小军</author><pubDate>Tue, 26 Jul 2016 15:05:00 GMT</pubDate><guid>http://www.blogjava.net/qbna350816/archive/2016/07/26/431337.html</guid><wfw:comment>http://www.blogjava.net/qbna350816/comments/431337.html</wfw:comment><comments>http://www.blogjava.net/qbna350816/archive/2016/07/26/431337.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/qbna350816/comments/commentRss/431337.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/qbna350816/services/trackbacks/431337.html</trackback:ping><description><![CDATA[<div yne-bulb-block="paragraph" style="white-space: pre-wrap; line-height: 1.875;"><span style="font-family:Arial;color:#666666;background-color:#ffffff">鸟欲高飞先振翅，人求上进先读书。本文是原书的第9章 线程的监控及其日常工作中如何分析里的9.3.3节常见的内存溢出的三种情况。</span></div><div yne-bulb-block="paragraph" style="white-space: pre-wrap; line-height: 2.5;"></div><div yne-bulb-block="paragraph" style="white-space: pre-wrap; line-height: 2.5;"><span style="font-family:Arial;color:#800000;background-color:#ffffff;font-weight:bold">3. 常见的内存溢出的三种情况：</span></div><div yne-bulb-block="paragraph" style="white-space: pre-wrap; line-height: 2.5;"><span style="font-family:Arial;color:#ff0000;background-color:#ffffff;font-weight:bold">1）JVM Heap（堆）溢出：java.lang.OutOfMemoryError: Java heap space</span></div><div yne-bulb-block="paragraph" style="white-space: pre-wrap; line-height: 2.5;"><span style="font-family:Arial;color:#666666;background-color:#ffffff">JVM在启动的时候会自动设置JVM Heap的值， 可以利用JVM提供的-Xmn -Xms -Xmx等选项可进行设置。Heap的大小是Young Generation 和Tenured Generaion 之和。在JVM中如果98%的时间是用于GC,且可用的Heap size 不足2%的时候将抛出此异常信息。</span></div><div yne-bulb-block="paragraph" style="white-space: pre-wrap; line-height: 2.5;"><span style="font-family:Arial;color:#ff0000;background-color:#ffffff;font-weight:bold">解决方法：手动设置JVM Heap（堆）的大小。</span></div><div yne-bulb-block="paragraph" style="white-space: pre-wrap; line-height: 2.5;"><span style="font-family:Arial;color:#ff0000;background-color:#ffffff;font-weight:bold">2）PermGen space溢出： java.lang.OutOfMemoryError: PermGen space</span></div><div yne-bulb-block="paragraph" style="white-space: pre-wrap; line-height: 2.5;"><span style="font-family:Arial;color:#666666;background-color:#ffffff">PermGen space的全称是Permanent Generation space,是指内存的永久保存区域。为什么会内存溢出，这是由于这块内存主要是被JVM存放Class和Meta信息的，Class在被Load的时候被放入PermGen space区域，它和存放Instance的Heap区域不同，sun的 GC不会在主程序运行期对PermGen space进行清理，所以如果你的APP会载入很多CLASS的话，就很可能出现PermGen space溢出。一般发生在程序的启动阶段。</span></div><div yne-bulb-block="paragraph" style="white-space: pre-wrap; line-height: 2.5;"><span style="font-family:Arial;color:#ff0000;background-color:#ffffff;font-weight:bold">解决方法： 通过-XX:PermSize和-XX:MaxPermSize设置永久代大小即可。</span></div><div yne-bulb-block="paragraph" style="white-space: pre-wrap; line-height: 2.5;"><span style="font-family:Arial;color:#ff0000;background-color:#ffffff;font-weight:bold">3）栈溢出： java.lang.StackOverflowError : Thread Stack space</span></div><div yne-bulb-block="paragraph" style="white-space: pre-wrap; line-height: 2.5;"><span style="font-family:Arial;color:#666666;background-color:#ffffff">栈溢出了，JVM依然是采用栈式的虚拟机，这个和C和Pascal都是一样的。函数的调用过程都体现在堆栈和退栈上了。调用构造函数的 &#8220;层&#8221;太多了，以致于把栈区溢出了。 通常来讲，一般栈区远远小于堆区的，因为函数调用过程往往不会多于上千层，而即便每个函数调用需要 1K的空间（这个大约相当于在一个C函数内声明了256个int类型的变量），那么栈区也不过是需要1MB的空间。通常栈的大小是1-2MB的。通俗一点讲就是单线程的程序需要的内存太大了。 通常递归也不要递归的层次过多，很容易溢出。</span></div><div yne-bulb-block="paragraph" style="white-space: pre-wrap; line-height: 2.5;"><span style="font-family:Arial;color:#ff0000;background-color:#ffffff;font-weight:bold">解决方法：1：修改程序。2：通过 -Xss: 来设置每个线程的Stack大小即可。</span></div><div yne-bulb-block="paragraph" style="white-space: pre-wrap; line-height: 2.5;"><span style="font-family:Arial;color:#800000;background-color:#ffffff;font-weight:bold;text-decoration:underline">4. 所以Server容器启动的时候我们经常关心和设置JVM的几个参数如下（详细的JVM参数请参看附录三）：</span></div><div yne-bulb-block="paragraph" style="white-space: pre-wrap; line-height: 2.5;"><span style="font-family:Arial;color:#666666;background-color:#ffffff">-Xms：java Heap初始大小， 默认是物理内存的1/64。</span></div><div yne-bulb-block="paragraph" style="white-space: pre-wrap; line-height: 2.5;"><span style="font-family:Arial;color:#666666;background-color:#ffffff">-Xmx：ava Heap最大值，不可超过物理内存。</span></div><div yne-bulb-block="paragraph" style="white-space: pre-wrap; line-height: 2.5;"><span style="font-family:Arial;color:#666666;background-color:#ffffff">-Xmn：young generation的heap大小，一般设置为Xmx的3、4分之一 。增大年轻代后,将会减小年老代大小，可以根据监控合理设置。</span></div><div yne-bulb-block="paragraph" style="white-space: pre-wrap; line-height: 2.5;"><span style="font-family:Arial;color:#666666;background-color:#ffffff">-Xss：每个线程的Stack大小，而最佳值应该是128K,默认值好像是512k。</span></div><div yne-bulb-block="paragraph" style="white-space: pre-wrap; line-height: 2.5;"><span style="font-family:Arial;color:#666666;background-color:#ffffff">-XX:PermSize：设定内存的永久保存区初始大小，缺省值为64M。</span></div><div yne-bulb-block="paragraph" style="white-space: pre-wrap; line-height: 2.5;"><span style="font-family:Arial;color:#666666;background-color:#ffffff">-XX:MaxPermSize：设定内存的永久保存区最大大小，缺省值为64M。</span></div><div yne-bulb-block="paragraph" style="white-space: pre-wrap; line-height: 2.5;"><span style="font-family:Arial;color:#666666;background-color:#ffffff">-XX:SurvivorRatio：Eden区与Survivor区的大小比值,设置为8,则两个Survivor区与一个Eden区的比值为2:8,一个Survivor区占整个年轻代的1/10</span></div><div yne-bulb-block="paragraph" style="white-space: pre-wrap; line-height: 2.5;"><span style="font-family:Arial;color:#666666;background-color:#ffffff">-XX:+UseParallelGC：F年轻代使用并发收集,而年老代仍旧使用串行收集.</span></div><div yne-bulb-block="paragraph" style="white-space: pre-wrap; line-height: 2.5;"><span style="font-family:Arial;color:#666666;background-color:#ffffff">-XX:+UseParNewGC：设置年轻代为并行收集,JDK5.0以上,JVM会根据系统配置自行设置,所无需再设置此值。</span></div><div yne-bulb-block="paragraph" style="white-space: pre-wrap; line-height: 2.5;"><span style="font-family:Arial;color:#666666;background-color:#ffffff">-XX:ParallelGCThreads：并行收集器的线程数，值最好配置与处理器数目相等 同样适用于CMS。</span></div><div yne-bulb-block="paragraph" style="white-space: pre-wrap; line-height: 2.5;"><span style="font-family:Arial;color:#666666;background-color:#ffffff">-XX:+UseParallelOldGC：年老代垃圾收集方式为并行收集(Parallel Compacting)。</span></div><div yne-bulb-block="paragraph" style="white-space: pre-wrap; line-height: 2.5;"><span style="font-family:Arial;color:#666666;background-color:#ffffff">-XX:MaxGCPauseMillis：每次年轻代垃圾回收的最长时间(最大暂停时间)，如果无法满足此时间,JVM会自动调整年轻代大小,以满足此值。</span></div><div yne-bulb-block="paragraph" style="white-space: pre-wrap; line-height: 2.5;"><span style="font-family:Arial;color:#666666;background-color:#ffffff">-XX:+ScavengeBeforeFullGC：Full GC前调用YGC,默认是true。</span></div><div yne-bulb-block="paragraph" style="white-space: pre-wrap; line-height: 2.5;"><span style="font-family:Arial;color:#666666;background-color:#ffffff">实例如：JAVA_OPTS=&#8221;-Xms4g -Xmx4g -Xmn1024m -XX:PermSize=320M -XX:MaxPermSize=320m -XX:SurvivorRatio=6&#8243;</span></div><div yne-bulb-block="paragraph" style="white-space: pre-wrap; line-height: 2.5;"><span style="font-family:Arial;color:#666666;background-color:#ffffff;font-weight:bold;font-style:italic">原创文章，转载请注明：</span><span style="font-family:Arial;color:#666666;background-color:#ffffff;font-style:italic">&nbsp;转载自</span><a href="http://ifeve.com/"><span style="font-family: Arial; color: #00a19e; font-style: italic; background-color: #ffffff;">并发编程网 &#8211; ifeve.com</span></a><span style="font-family:Arial;color:#666666;background-color:#ffffff;font-weight:bold;font-style:italic">本文链接地址:</span>&nbsp;<a href="http://ifeve.com/java-concurrency-9-3-3/"><span style="font-family: Arial; color: #00a19e; font-style: italic; background-color: #ffffff;">《 Java并发编程从入门到精通》 常见的内存溢出的三种情况</span></a></div><img src ="http://www.blogjava.net/qbna350816/aggbug/431337.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/qbna350816/" target="_blank">胡小军</a> 2016-07-26 23:05 <a href="http://www.blogjava.net/qbna350816/archive/2016/07/26/431337.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>