我所理解的JVM(七):JVM調優

以前全部關於JVM的知識,主要視爲JVM調優作準備的。
對於虛擬機的調優步驟,通常分爲3步:html

  1. 根據必定參數啓動虛擬機
  2. 配置好壓力測試參數進行壓力測試
  3. 可視化工具或者命令行查看虛擬機運行狀態和GC日誌進行分析

以上3步循環執行,最終目的是肯定好啓動參數。併發

考覈虛擬機的指標jvm

  • 吞吐量:重要指標之一,是指不考慮垃圾收集引發的停頓時間或內存消耗,垃圾收集器能支撐應用達到的最高性能指標。
  • 延遲:其度量標準是縮短因爲垃圾啊收集引發的停頓時間或者徹底消除因垃圾收集所引發的停頓,避免應用運行時發生抖動。
  • 內存佔用:垃圾收集器流暢運行所須要 的內存數量。

  通常虛擬機的所使用的內存是肯定的,優化指標主要體如今需求上是要低延遲仍是高吞吐量。工具

  壓力測試的參數及接口主要看業務。性能

Jdk在jdk/bin目錄下自帶了一些可視化工具: 如jvisualvm和jconsole。
Jdk在運行時也可使用命令行來查看當前虛擬機的運行狀態:測試

  • jps:查看當前虛擬機的進程情況。參數-v能夠查看JVM的啓動參數。
  • jstat:查看當前虛擬機的統計信息。很是重要。
  • jinfo:查看當前虛擬機的配置信息。好比未顯式指定的一些默認值和默認選項
  • jmap:生成堆轉儲快照,dump文件。
  • jhat:轉儲快照的分析工具。不多使用。
  • jstack:生成當前虛擬機的線程快照。
  • hsdis:JIT生成代碼反彙編。

壓測調優階段推薦使用可視化工具。線上緊急排查定位問題時使用命令行查看。優化

對於GC日誌來講,都是一些固定的格式,能看懂就行。spa

特別注意的是:啓動JVM後的操做系統自己的剩餘內存必定要足夠,在調優期間,要適當查看系統剩餘內存狀態,不能太低。操作系統

常見的GC方式:.net

  • Serial
  • ParNew + CMS
  • ParallelYoung + ParallelOld
  • G1GC

JVM常見設置

堆設置

-Xms:初始堆大小
-Xmx:最大堆大小
-Xmn:年輕代內存大小 -XX:NewRatio:設置年輕代和年老代的比值。
-XX:SurvivorRatio:年輕代中Eden區與兩個Survivor區的比值。
-XX:MaxPermSize:設置持久代大小,jdk1.7以前有效。1.8以後給爲元空間 -XX:MaxMetaspaceSize:設置元空間大小 -XX:PretenureSizeThreshold:直接晉升到老年代的對象大小。大於這個參數的對象將直接在老年代分配 -XX:MaxTenuringThrehold:晉升到老年代的對象年齡。當超過這個參數值時就進入老年代 -XX:+UseAdaptiveSizePolicy:動態調整Java堆中各個區域的大小以及進入老年代的年齡

收集器設置

-XX:+UseSerialGC:在新生代和老年代使用串行收集器
-XX:+UseParalledlOldGC:設置並行年老代收集器
-XX:+UseParNewGC:在新生代使用並行收集器
-XX:+UseParallelGC :新生代使用並行回收收集器
-XX:+UseParallelOldGC:老年代使用並行回收收集器
-XX:+UseConcMarkSweepGC:新生代使用並行收集器,老年代使用CMS+串行收集器

垃圾回收統計信息

-XX:+PrintGC
-XX:+PrintGCDetails
-XX:+PrintGCTimeStamps
-Xloggc:filename

並行收集器設置

-XX:ParallelGCThreads=n:設置並行收集器收集時使用的CPU數。並行收集線程數
-XX:MaxGCPauseMillis=n:設置並行收集最大暫停時間
-XX:GCTimeRatio=n:設置垃圾回收時間佔程序運行時間的百分比。公式爲1/(1+n)

併發收集器設置

-XX:+CMSIncrementalMode:設置爲增量模式。適用於單CPU狀況
-XX:ParallelGCThreads=n:設置併發收集器年輕代收集方式爲並行收集時,使用的CPU數。並行收集線程數 -XX:ParallelCMSThreads:設定CMS的線程數量
-XX:CMSInitiatingOccupancyFraction:設置CMS收集器在老年代空間被使用多少後觸發
-XX:+UseCMSCompactAtFullCollection:設置CMS收集器在完成垃圾收集後是否要進行一次內存碎片的整理
-XX:CMSFullGCsBeforeCompaction:設定進行多少次CMS垃圾回收後,進行一次內存壓縮
-XX:+CMSClassUnloadingEnabled:容許對類元數據進行回收
-XX:CMSInitiatingPermOccupancyFraction:當永久區佔用率達到這一百分比時,啓動CMS回收
-XX:UseCMSInitiatingOccupancyOnly:表示只在到達閥值的時候,才進行CMS回收

參考資料:

  1. 《深刻理解Java虛擬機》
  2. JVM原理講解和調優
  3. JVM調優總結
  4. 如何合理的規劃一次jvm性能調優
相關文章
相關標籤/搜索