JVM調優

原資料java

jvm 類型

有兩種類型的 hotspot jvm ,即 「service」 和 「client" 。 jvm 可根據內存,機器狀況,自動選擇jvm類型。 若是想手動選擇,則可經過 -service-client 參數指定jvm 類型。算法

  1. servcie : 服務端類型,有更多的堆內存,並行的垃圾收集器,運行時可更大程度的優化代碼
  2. client : 客戶端類型,相比服務端類型,有更少的堆內存
  3. 查看jvm版本以及類型

    java -version併發

jvm 參數分類

  1. 標準參數
    1. 穩定的,未來的jvm版本不會改變的參數,可經過 java 或者 java -help 命令檢出的
  2. X參數
    1. 非標準化的參數,未來的jvm 版本中可能會改變的,可經過 java -X 命令檢出,但並非全部該類型都能檢出
  3. XX 參數
    1. 不穩定的,甚至是在實驗階段的參數,甚至長時間段內未被列出,該類型參數都以 -XX 開頭,可是隨後的語法不一樣,取決於參數的類型。 可經過 -XX:+PrintFlagsFinal 或者 -XX:+PrintFlagsFinalInitial 輸出全部XX類型參數信息(參數類型,參數名稱,默認值=,被用戶或者jvm賦值 :=)

    對於布爾類型的參數,咱們有」+」或」-「,而後才設置JVM選項的實際名稱。例如,-XX:+用於激活選項,而-XX:-用於註銷選項。 -XX:+PrintCompilation :輸出編譯信息 -XX:+ClTime : 關閉jvm 時輸出編譯時效統計信息 -XX:+PrintCommandLineFlags : 輸出全部被用戶或者jvm 設置過的XX參數以及值 對於須要非布爾值的參數,如string或者integer,咱們先寫參數的名稱,後面加上」=」,最後賦值。例如,  -XX:=給賦值。jvm

jvm 調優參數

  1. Xms128m : 初始化堆內存大小爲128M,不包括永久代的空間,是 -XX:InitailHeapSize=128m 的縮小
  2. Xmx2g : 最大堆內存大小 爲 2G,不包括永久代的空間, 是 -XX:MaxHeapSize=2g 的縮小
  3. -XX:+HeapDumpOnOutOfMemoryError : jvm 發送內存溢出時自動生成堆內存快照
  4. -XX:HeapDumpPath= :設置堆內存快照生成的路徑
  5. -XX:OnOutOfMemory="" : 可接收一串指令,當堆內存溢出時,執行指令
  6. -XX:PermSize= : 初始化永久代大小
  7. -XX:MaxPermSize= : 最大永久代大小

新生代垃圾回收

  1. 新生代特徵優化

    1. 新生代對象朝生夕死,生命週期短,基本採用複製算法作垃圾回收
  2. 新生代劃分ui

    1. 伊甸園區(Eden): 對象最開始在此分配到內存
    2. 倖存區(suivivor): 新生代垃圾回收時,存活對象符合條件(年齡,大小)會被移入倖存區
      1. from,to : 大小一致,from 和 to 的做用會來回轉換
  3. 調優參數線程

    1. -XX:NewSize : 初始化新生代大小
    2. -XX:MaxNewSize : 最大新生代大小
    3. -XX:NewRatio=3 : 老年代和新生代的大小比, 老年代/新生代 : 3/1 ,新生代爲整個堆區的 1/4
    4. -XX:SuivivorRatio=8 : 伊甸園區和單個倖存區(from/to)的大小比 , 伊甸園區佔新生代8/10,from和to區域佔新生代 1/10

垃圾回收器評估標準

  1. 吞吐量 :吞吐量越高越好,吞吐量:應用程序線程佔程序總用時比例
  2. 暫停時間 : stop the world 的時間越短越好。
  3. 高吞吐量和低暫停時間互相矛盾,高吞吐(減小GC 線程佔時)-> 減小GC 線程數/ 減小GC次數; 低暫停-> 垃圾回收量有限 -> 增長GC次數 -> 增長GC線程總佔有時間 -> 低吞吐

CMS 收集器

  1. 基本介紹
    1. 低暫停型收集器,大多數時間GC線程能夠和應用線程並行
    2. 基於標記-清除算法,無壓縮操做,容易產生碎片
    3. 針對老年代
  2. 執行過程
    1. 初始化標記:stop the world ,標記gc root 指向的對象爲存活對象,標記年輕的中可達老年代的對象
    2. 併發標記 : gc root tracing ,標記gc root 指向的對象所指向的對象爲存活對象
    3. 併發預清理
    4. 重標記:stop the world ,修正併發標記階段應用線程改動了的對象
    5. 併發清理 : 清理無用引用,回收堆內存
    6. 併發處置:收尾工做
  3. 可能存在的問題
    1. 內存碎片化
    2. 浮動垃圾 : 併發標記階段,產生的新垃圾,當前的GC 沒法清理的垃圾,須要下次GC 再清理
  4. 經常使用命令
    1. -XX:+UseConcMarkSweepGC :指定使用CMS 收集器
    2. -XX:+UseCompactAtFullCollection : 開啓內存碎片的壓縮整合
    3. -XX:+CMSFullGcsBeforeCompact : 與*-XX:+UseCompactAtFullCollection* 一塊兒使用,指定執行多少次不壓縮gc 後,進行一次壓縮整合,可緩解碎片化問題
    4. -XX:CMSInitiatingOccupancyFraction=75 : 老年代使用率達到75%時進行垃圾回收,須要預留空間,給浮動垃圾和新進入老年代的對象,因此該值不能過高
  5. 1,2,3 步或者2,3,4步的做用

GC 日誌

  1. -XX:+PrintGC
    輸出基本的gc 信息:gc類型,gc 先後堆內存的使用大小,gc耗時
  2. -XX:+PrintGCDetails
    輸出詳細的gc 信息:gc類型,所使用的gc器,gc先後堆內存的使用大小,堆內存的總大小,gc耗時
  3. -Xloggc
    指定gc 日誌輸出文件,默認設置了 -XX:+PrintGC-XX:+PrintGCTimeStamps
相關文章
相關標籤/搜索