Java GC調優(下)

4.Sun HotSpot 垃圾回收器

 概述

當永久代和舊生代出發GC時,除CMS外都會發生Full GC

  • 首先按照 新生代配置的GC,發生Mintor GC
  • 再按照舊生代配置的GC,對舊生代和永久代GC
  • 若JVM 對Mintor GC後可能會發生晉升失敗,則直接採用舊生代配置的GC對Young,old,Perm進行GC.

一些術語解釋

圖1

圖2

新生代可用GC

均使用複製算法,原理一樣。

  1.  拷貝eden和from中的存活對象到to中;
  2. 部分對象由於某些原因直接晉升到old中;
  3. 清空eden、from,from和to交換下身份,直到下一次GC發生

分配對象時,Eden區內存不足時觸發

  Serial Copying

 特性 

      serial (串行),stop-the-world

適用場景

  • 單cpu,新生代小,對暫時時間要求不高的
  • client級別或32位window上默認選擇

直接分配到old的規則

  •  對象大小超過eden space
  •  大對象(PretenureSizeThreadold)晉升old

晉升規則

  •    經歷多次Mintor GC 仍存活的對象
  •  To Survivor滿或空間不足,直接晉升

ParNew

  特性

  • 可以認爲是Serial Copying的多線程版本
  • 可搭配CMS(Concurrent Mark Sweep)
  • 不可搭配Parallel old

ParNew Scavenge

特性

  •  Parallel Stop-the-world
  •  並行默認參數

        cpu核數<=8:=cpu核數

        cpu核數>8:=(3+cpu核心*5)/8

  •  調節策略(GC Ergonomics)

       會根據Mintor GC頻率、時間動態的調整Eden\S0\S1大小,可以消除特性(-XX:UseAdaptiveSizePolicy)

適用場景

  • 多cpu,暫停較短的應用
  • server級別,2核2G 機器上的默認選擇

直接分配到old的規則

  •  在TLAB和Eden上分配失敗,對象大小大於Eden的一半
  •  PretenureSizeThreadold 參數無效

晉升規則

  •   經歷多次Mintor GC仍存活對象
  •  To Survivor內存滿的對象直接晉升

舊生代可用的GC

Serial old(Serial  MSC)

 特性

  • Serial、Stop-the-world
  • 使用算法Mark-Sweep-Compact
  • 由於是單線程,可能造成GC暫停時間可能會很長,可使用-XX:PrintGCApplicationStoppedTime查看暫停時間

 適用場景

  • client級別或32位window上默認選擇

Parallel old(Parallel compacting)

 特性

  •  Parallel、Stop-the-world
  •  使用算法:Mark-compact

    算法描述圖:

        

 適用場景

  • 多cpu,暫停較短的應用
  • server級別,2核2G 機器上的默認選擇

CMS(Concurrent Mark Sweep)

特性

  • Parallel、Concurrent
  • 使用算法:Mark-sweep

        算法描述圖:

        

  • 縮短GC暫停時間,比較複雜,GC總時間增加
  • 默認併發數=(處理器核心數+3)/4,也可以用-XX:ParallelCMSThreads=2
  • Prem Generation也可以啓用CMS,-XX:+CMSPermSweepingEnabled,-XX:+CMSClassUnloadingEnabled

適用場景

  •   短暫回收停頓時間,服務響應速度快的應用,尤其是互聯網或基於B/S系統的服務上

缺點

  •  搶佔應用CPU
  • GC耗時長
  • 浮動垃圾
  • 內存碎片
  • Mintor GC耗時長,每次promotion提升都搜索free-list

組合

標準

    吞吐量(throughput)=應用時間/總時間  關注耗時時間

    暫停時間(Latency)關注每次GC造成的暫停

組合選擇

  • 單cpu或小內存,單機程序   

         -XX:+UseSerialGC

  • 多cpu,需要大吞吐量,如計算型應用   

        -XX:+UseParallerGC或 -XX:+UseParallerOldGC

  •  多cpu,追求停頓時間短,需要響應速度快的互聯網應用 

       -XX:+UseConcMarkSweepGC   -XX:ParNewGC

自動選擇GC方式

  •  吞吐量優先

        -XX:GCTimeRatio=n

  • 暫停時間短 

         -XX:MaxGCPauseMillis=n

  • 一般不用

調優

    堆大小的調優

  • 堆越大越好

                降低GC頻率,單過大可能增加單次GC時間

                對象更有可能成爲垃圾

  • 受硬件和系統的限制

           32位操作系統單個進程最大可用內存2G,64無限 

           New和Old的比例

  • 參數

          -Xms=1024MB

          -Xmx=1024MB

           堆每次調整就會出發Full GC,避免調整可設置-Xms=-Xmx

    新生代調優

  •  增大Eden的大小

          降低GC的頻率

          不一定會增大Mintor GC的時間

           Mintor GC耗時與要拷貝的對象(存活對象多少成正比)

  • 參數

         -XX:NewSzie1024MB   新生代初始化大小

        -XX:MaxNewSzie=1024MB    新生代最大大小

       -XX:NewReatio=m    New和Old比值

      -Xmn=1024MB   新生代大小  (一般使用這個固定新生代大小)

   新生代晉升

  • 儘可能的讓對象呆在Survivor中,是新生代收回
  • 避免長時間存活對象在Survivor中不必要的拷貝
  • 不容易找平衡點:better copy more ,than promote more
  • -XX:SurvivorRatio=m  Eden和Survivor比值
  •  對象晉升年齡的閥值:Tenuring Threshold

舊生代調優

  • 儘可能調優新生代
  • 在不緊的的時間段手動Full GC
  • 大小平衡   

     太大 GC時間長  太小 GC頻率高

  • 硬件優化
  • 程序優化,避免無用對象在oldko空間

監控工具

  • JVM參數

     -XX:+PrintGC(JDK8)  查看GC基本信息

     -XX:+PrintGCDetail (JDK8)  查看GC詳細信息

     -XX:+PrintGCTimeStamps (JDK8) 查看GC過程用戶線程併發時間

     -XX:+PrintGCApplicationStoppedTime (JDK8)查看GC過程用戶線程併發時間暫停時間

    -Xlogg:c:/../xx.log  輸出文件

  • 命令行工具

       查看內存使用情況,head dump:jmap+jhat

       查看GC情況:jstat

JConsole:Java監視與管理控制檯

JConsole(Java Monitoring and Management Console)是一種基於JMX的可視化監視、管理工

 具。它管理部分的功能是針對JMX MBean進行管理,由於MBean可以使用代碼、中間件服務器

      的管理控制檯或者所有符合JMX規範的軟件進行訪問。

VisualVM:多合一故障處理工具

             VisualVM(All-in-One Java Troubleshooting Tool)是到目前爲止隨JDK發佈的功能最強大

             的運行監視和故障處理程序。VisualVM的還有一個很大的優點:不需要被監視的程序基於特殊

             Agent運行,因此它對應用程序的實際性能的影響很小,使得它可以直接應用在生產環境

            JMC,Oracle Java Mission Control 是一個用於對 Java 應用程序進行管理、監視、概要分析和

           故障排除的工具套件。首次安裝時,Java Mission Control 包括 JMX 控制檯和 Java 飛行記錄器。

          從 Mission Control 中可以輕鬆安裝更多插件

 

 

 

Eclipse EMemoryAnalyzer

java GC調優(上)

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章