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),程序優化