JVM(四):JVM調優

JVM調優

1、命令大全

1.jps

JVM Process Status Tool,顯示指定系統內全部的HotSpot虛擬機進程。java

jps [options] [hostid]
-l : 輸出主類全名或jar路徑
-q : 只輸出LVMID
-m : 輸出JVM啓動時傳遞給main()的參數
-v : 輸出JVM啓動時顯示指定的JVM參數
jps -l -m

 

2.jstat

jstat [option] LVMID [interval] [count]
  • [option] : 操做參數
  • LVMID : 本地虛擬機進程ID
  • [interval] : 連續輸出的時間間隔
  • [count] : 連續輸出的次數

 

  • jstat -class 11589 監視類裝載、卸載數量、總空間以及耗費的時間
  • jstat -compiler 1262 輸出JIT編譯過的方法數量耗時等
  • jstat -gc 1262 垃圾回收堆的行爲統計
  • jstat -gc 1262 2000 20 每隔2000ms輸出1262的gc狀況,一共輸出20次
  • jstat -gccapacity 1262 同-gc,不過還會輸出Java堆各區域使用到的最大、最小空間
  • jstat -gcutil 28920 同-gc,不過輸出的是已使用空間佔總空間的百分比
  • jstat -gccause 28920 垃圾收集統計概述(同-gcutil),附加最近兩次垃圾回收事件的緣由
  • jstat -gcnew 28920 統計新生代的行爲
  • jstat -gcnewcapacity 28920 新生代與其相應的內存空間的統計
  • jstat -gcold 28920 統計舊生代的行爲
  • jstat -gcpermcapacity 28920 永生代行爲統計
  • jstat -printcompilation 28920 hotspot編譯方法統計

3.jmap

jmap(JVM Memory Map)命令用於生成heap dump文件,若是不使用這個命令,還闊以使用-XX:+HeapDumpOnOutOfMemoryError參數來讓虛擬機出現OOM的時候·自動生成dump文件。
jmap不只能生成dump文件,還闊以查詢finalize執行隊列、Java堆和永久代的詳細信息,如當前使用率、當前使用的是哪一種收集器等。算法

jmap [option] LVMID
  • dump : 生成堆轉儲快照
  • finalizerinfo : 顯示在F-Queue隊列等待Finalizer線程執行finalizer方法的對象
  • heap : 顯示Java堆詳細信息
  • histo : 顯示堆中對象的統計信息
  • permstat : to print permanent generation statistics
  • F : 當-dump沒有響應時,強制生成dump快照

 

  • jmap -dump:live,format=b,file=dump.hprof 28920   dump堆到文件,format指定輸出格式,live指明是活着的對象,file指定文件名
  • jmap -heap 28920                           打印heap的概要信息,GC使用的算法,heap的配置及wise heap的使用狀況,能夠用此來判斷內存目前的使用狀況以及垃圾回收狀況
  • jmap -histo:live 28920 | more              打印堆的對象統計,包括對象數、內存大小等等 
  • jmap -permstat 28920                       打印Java堆內存的永久保存區域的類加載器的智能統計信息

 

4.jhat

jhat(JVM Heap Analysis Tool)命令是與jmap搭配使用,用來分析jmap生成的dump,jhat內置了一個微型的HTTP/HTML服務器,生成dump的分析結果後,能夠在瀏覽器中查看。瀏覽器

通常不會直接在服務器上進行分析,由於jhat是一個耗時而且耗費硬件資源的過程,通常把服務器生成的dump文件複製到本地或其餘機器上進行分析。服務器

jhat [dumpfile]
    • -stack false|true
      關閉對象分配調用棧跟蹤(tracking object allocation call stack)。 若是分配位置信息在堆轉儲中不可用. 則必須將此標誌設置爲 false. 默認值爲 true.>
    • -refs false|true
      關閉對象引用跟蹤(tracking of references to objects)。 默認值爲 true. 默認狀況下, 返回的指針是指向其餘特定對象的對象,如反向連接或輸入引用(referrers or incoming references), 會統計/計算堆中的全部對象。>
    • -port port-number
      設置 jhat HTTP server 的端口號. 默認值 7000.>
    • -exclude exclude-file
      指定對象查詢時須要排除的數據成員列表文件(a file that lists data members that should be excluded from the reachable objects query)。 例如, 若是文件列列出了 java.lang.String.value , 那麼當從某個特定對象 Object o 計算可達的對象列表時, 引用路徑涉及 java.lang.String.value 的都會被排除。>
    • -baseline exclude-file
      指定一個基準堆轉儲(baseline heap dump)。 在兩個 heap dumps 中有相同 object ID 的對象會被標記爲不是新的(marked as not being new). 其餘對象被標記爲新的(new). 在比較兩個不一樣的堆轉儲時頗有用.>
    • -debug int
      設置 debug 級別. 0 表示不輸出調試信息。 值越大則表示輸出更詳細的 debug 信息.>
    • -version
      啓動後只顯示版本信息就退出>
    • -J< flag >
      由於 jhat 命令實際上會啓動一個JVM來執行, 經過 -J 能夠在啓動JVM時傳入一些啓動參數. 例如, -J-Xmx512m 則指定運行 jhat 的Java虛擬機使用的最大堆內存爲 512 MB. 若是須要使用多個JVM啓動參數,則傳入多個 -Jxxxxxx.

jhat -J-Xmx512m dump.hprof工具

 

5.jstack

jstack用於生成java虛擬機當前時刻的線程快照。優化

線程快照是當前java虛擬機內每一條線程正在執行的方法堆棧的集合,生成線程快照的主要目的是定位線程出現長時間停頓的緣由,如線程間死鎖、死循環、請求外部資源致使的長時間等待等。spa

線程出現停頓的時候經過jstack來查看各個線程的調用堆棧,就能夠知道沒有響應的線程到底在後臺作什麼事情,或者等待什麼資源。 線程

若是java程序崩潰生成core文件,jstack工具能夠用來得到core文件的java stack和native stack的信息,從而能夠輕鬆地知道java程序是如何崩潰和在程序何處發生問題。debug

另外,jstack工具還能夠附屬到正在運行的java程序中,看到當時運行的java程序的java stack和native stack的信息, 若是如今運行的java程序呈現hung的狀態,jstack是很是有用的。指針

jstack [option] LVMID
  • -F : 當正常輸出請求不被響應時,強制輸出線程堆棧
  • -l : 除堆棧外,顯示關於鎖的附加信息
  • -m : 若是調用到本地方法的話,能夠顯示C/C++的堆棧

jstack -l 11494|more

 

6.jinfo

jinfo(JVM Configuration info)這個命令做用是實時查看和調整虛擬機運行參數。
以前的jps -v口令只能查看到顯示指定的參數,若是想要查看未被顯示指定的參數的值就要使用jinfo口令

jinfo [option] [args] LVMID
  • flag : 輸出指定args參數的值
  • -flags : 不須要args參數,輸出全部JVM參數的值
  • -sysprops : 輸出系統屬性,等同於System.getProperties()

jinfo -flag 11494

 

2、調優

堆大小調優

通常來講堆越大越好,

  • 能夠下降GC頻率,但會增長單次GC時間;
  • 對象更有可能成爲垃圾

參數

堆每次調整都會觸發一次 FullGC,避免頻繁調整能夠設置-Xms = -Xmx

新生代調優

大小

增大Eden的大小

  下降MinorDC的頻率,但不必定會增大MinorGC的時間

參數

  • -XX:NewSize=1024MB        新生代初始大小
  • -XX: MaxNewSize=1024MB  新生代最大值
  • -XX:NewRatio=m    New和   Old的比值
  • -Xmn=1024MB              新生代大小

通常用Xmn固定新生代大小 

晉升

儘量讓對象呆在Survivor中,使之在新生代被回收,同時避免長時間存活的對象在Survivor間沒必要要的拷貝(Better copy more, than promote more)

-XX: SurvivorRation=m           Eden和Survivor比值

舊生代調優

對於CMS,在不緊要時間段手動FullGC

大小平衡,太大單次GC時長高,過小GC頻率高

硬件優化(加CPU),程序優化

相關文章
相關標籤/搜索