隨筆 - 41  文章 - 7  trackbacks - 0
          <2016年7月>
          262728293012
          3456789
          10111213141516
          17181920212223
          24252627282930
          31123456

          常用鏈接

          留言簿

          隨筆分類

          隨筆檔案

          搜索

          •  

          最新評論

          閱讀排行榜

          評論排行榜

          鳥欲高飛先振翅,人求上進先讀書。本文是原書的第9章 線程的監控及其日常工作中如何分析里的9.3.3節常見的內存溢出的三種情況。
          3. 常見的內存溢出的三種情況:
          1)JVM Heap(堆)溢出:java.lang.OutOfMemoryError: Java heap space
          JVM在啟動的時候會自動設置JVM Heap的值, 可以利用JVM提供的-Xmn -Xms -Xmx等選項可進行設置。Heap的大小是Young Generation 和Tenured Generaion 之和。在JVM中如果98%的時間是用于GC,且可用的Heap size 不足2%的時候將拋出此異常信息。
          解決方法:手動設置JVM Heap(堆)的大小。
          2)PermGen space溢出: java.lang.OutOfMemoryError: PermGen space
          PermGen space的全稱是Permanent Generation space,是指內存的永久保存區域。為什么會內存溢出,這是由于這塊內存主要是被JVM存放Class和Meta信息的,Class在被Load的時候被放入PermGen space區域,它和存放Instance的Heap區域不同,sun的 GC不會在主程序運行期對PermGen space進行清理,所以如果你的APP會載入很多CLASS的話,就很可能出現PermGen space溢出。一般發生在程序的啟動階段。
          解決方法: 通過-XX:PermSize和-XX:MaxPermSize設置永久代大小即可。
          3)棧溢出: java.lang.StackOverflowError : Thread Stack space
          棧溢出了,JVM依然是采用棧式的虛擬機,這個和C和Pascal都是一樣的。函數的調用過程都體現在堆棧和退棧上了。調用構造函數的 “層”太多了,以致于把棧區溢出了。 通常來講,一般棧區遠遠小于堆區的,因為函數調用過程往往不會多于上千層,而即便每個函數調用需要 1K的空間(這個大約相當于在一個C函數內聲明了256個int類型的變量),那么棧區也不過是需要1MB的空間。通常棧的大小是1-2MB的。通俗一點講就是單線程的程序需要的內存太大了。 通常遞歸也不要遞歸的層次過多,很容易溢出。
          解決方法:1:修改程序。2:通過 -Xss: 來設置每個線程的Stack大小即可。
          4. 所以Server容器啟動的時候我們經常關心和設置JVM的幾個參數如下(詳細的JVM參數請參看附錄三):
          -Xms:java Heap初始大小, 默認是物理內存的1/64。
          -Xmx:ava Heap最大值,不可超過物理內存。
          -Xmn:young generation的heap大小,一般設置為Xmx的3、4分之一 。增大年輕代后,將會減小年老代大小,可以根據監控合理設置。
          -Xss:每個線程的Stack大小,而最佳值應該是128K,默認值好像是512k。
          -XX:PermSize:設定內存的永久保存區初始大小,缺省值為64M。
          -XX:MaxPermSize:設定內存的永久保存區最大大小,缺省值為64M。
          -XX:SurvivorRatio:Eden區與Survivor區的大小比值,設置為8,則兩個Survivor區與一個Eden區的比值為2:8,一個Survivor區占整個年輕代的1/10
          -XX:+UseParallelGC:F年輕代使用并發收集,而年老代仍舊使用串行收集.
          -XX:+UseParNewGC:設置年輕代為并行收集,JDK5.0以上,JVM會根據系統配置自行設置,所無需再設置此值。
          -XX:ParallelGCThreads:并行收集器的線程數,值最好配置與處理器數目相等 同樣適用于CMS。
          -XX:+UseParallelOldGC:年老代垃圾收集方式為并行收集(Parallel Compacting)。
          -XX:MaxGCPauseMillis:每次年輕代垃圾回收的最長時間(最大暫停時間),如果無法滿足此時間,JVM會自動調整年輕代大小,以滿足此值。
          -XX:+ScavengeBeforeFullGC:Full GC前調用YGC,默認是true。
          實例如:JAVA_OPTS=”-Xms4g -Xmx4g -Xmn1024m -XX:PermSize=320M -XX:MaxPermSize=320m -XX:SurvivorRatio=6″
          原創文章,轉載請注明: 轉載自并發編程網 – ifeve.com本文鏈接地址: 《 Java并發編程從入門到精通》 常見的內存溢出的三種情況
          posted on 2016-07-26 23:05 胡小軍 閱讀(337) 評論(0)  編輯  收藏 所屬分類: JVM

          只有注冊用戶登錄后才能發表評論。


          網站導航:
           
          主站蜘蛛池模板: 景宁| 白城市| 蓬莱市| 巴青县| 尉犁县| 宿州市| 辽阳市| 武冈市| 镇宁| 兴宁市| 澳门| 凌海市| 玉龙| 海安县| 益阳市| 罗江县| 罗平县| 保定市| 佛教| 孟村| 乃东县| 吴川市| 灵宝市| 抚远县| 鄂尔多斯市| 广饶县| 通化县| 墨脱县| 内乡县| 忻州市| 合川市| 遂昌县| 鄂托克旗| 叶城县| 姜堰市| 乌拉特前旗| 木兰县| 潮州市| 永昌县| 曲阳县| 右玉县|