聊一聊JVM性能調(diào)優(yōu)
我的程序需要JVM性能調(diào)優(yōu)嗎?
如果JVM頻繁fullGC,時停過長,出現(xiàn)outOfMemeory,系統(tǒng)響應(yīng)與吞吐量不高,就該考慮JVM性能調(diào)優(yōu)。
滿足下面的情況,一般不需要調(diào)優(yōu)
1.Minor GC 執(zhí)行時間不到 50ms;
2.Minor GC 執(zhí)行不頻繁,約 10 秒一次;
3.Full GC 執(zhí)行時間不到 1s;
4.Full GC 執(zhí)行頻率不算頻繁,不低于 10 分鐘 1 次;
我要從哪方面進行性能調(diào)優(yōu)
為了提升系統(tǒng)的性能,我們需要從各個層面去優(yōu)化,除了JVM調(diào)優(yōu),還可以從其他層面優(yōu)化。優(yōu)先考慮從代碼層面與數(shù)據(jù)庫層面進行優(yōu)化。

JVM調(diào)優(yōu)的統(tǒng)一標準是什么
很抱歉,沒有這玩意。JVM性能調(diào)優(yōu)取決于你的實際系統(tǒng)情況,不是網(wǎng)上隨便拷貝的一個性能參數(shù),然后跑起來就行。JVM調(diào)優(yōu)需要你先記錄目前的系統(tǒng)相應(yīng)參數(shù)、然后調(diào)整JVM的參數(shù),然后再壓測。比較上一次的結(jié)果,看看是否達到預(yù)期目標。一遍遍的比較與調(diào)整,非常繁瑣。
阿里JVM性能調(diào)優(yōu)建議
JVM性能調(diào)優(yōu)目的主要是為了優(yōu)化垃圾回收器,從而使得我們運行程序時,使用更少的內(nèi)存與更低的延遲,卻能會得到更大的吞吐量。
性能參數(shù)指標

JVM調(diào)優(yōu)原則

JVM性能調(diào)優(yōu)參照流程圖

常用JVM性能調(diào)優(yōu)參數(shù)


常用性能調(diào)優(yōu)工具
1.命令行工具jps
jps -q 輸出pid
jps -l: 輸出應(yīng)用程序主類完整 package 名稱或 jar 完整名稱.
jps -v: 列出 jvm 參數(shù)
jps -m 顯示main方法啟動時的傳入?yún)?shù)
2.命令行工具jstat
jstat -class pid:統(tǒng)計class數(shù)量、內(nèi)存空間,耗時
jstat -compiler pid:統(tǒng)計編譯成功、失敗的數(shù)量等信息
jstat -gc pid:垃圾回收統(tǒng)計
jstat -gccapacity pid:垃圾回收器內(nèi)存空間統(tǒng)計
jstat -gcmetacapacity pid:元數(shù)據(jù)內(nèi)存空間統(tǒng)計
jstat -gcnew pid:新生代垃圾回收統(tǒng)計
jstat -gcnewcapacity pid:新生代內(nèi)存空間統(tǒng)計
jstat -gcold pid:老年代垃圾回收統(tǒng)計
jstat -gcoldcapacity pid:老年代內(nèi)存空間統(tǒng)計
jstat -gcutil pid:總垃圾回收統(tǒng)計
jstat -printcompilation pid:JVM編譯方法統(tǒng)計
3.命令行工具jinfo
jinfo -sysprops pid :可以查看由 System.getProperties()取得的參數(shù)
jinfo -flags pid:查看曾經(jīng)操作過的一些參數(shù)
jinfo -flag name pid:查看某個具體屬性的值,如jinfo -flag MaxHeapSize 65535
jinfo –flag -[參數(shù)] pid 可以修改參數(shù):如jinfo -flag +PrintGC 63535
4.命令行工具jmap
jmap pid:查看進程的內(nèi)存映像信息
jmap -heap pid:顯示Java堆詳細信息
jmap -histo:live pid:顯示堆中對象的統(tǒng)計信息
jmap -clstats pid:打印類加載器信息
jmap -finalizerinfo pid:打印等待終結(jié)的對象信息
jmap -dump:format=b,file=heapdump.phrof pid:用于生成堆轉(zhuǎn)儲快照(一般稱為 heapdump 或 dump 文件)。jmap 的作用并不僅僅是為了獲取 dump 文件,它還可以查詢 finalize 執(zhí)行隊列、Java 堆的詳細信息,如空間使用率、當前用的是哪種收集器等。例子:jmap -dump:format=b,file=/opt/1.hprof 12023
Sun JDK 提供 jhat(JVM Heap Analysis Tool)命令與 jmap 搭配使用,來分析 jmap 生成的堆轉(zhuǎn)儲快照。
5.命令行工具jstack
用于生成當前時刻的線程快照,
jstack pid:打印堆棧信息到控制臺
jstack -F pid:當正常輸出的請求不被響應(yīng)時,強制輸出線程堆棧
jstack -m pid: 如果調(diào)用到本地方法的話,可以顯示C/C++的堆棧
jstack -l pid: 除堆棧外,顯示關(guān)于鎖的附加信息,在發(fā)生死鎖時可以用jstack -l pid來觀察鎖持有情況
6.可視化工具Jconsole
可以非常直觀的考到線程與內(nèi)存的情況

7.可視化工具visualvm


8.Jmeter壓測工具
1.本地下載地址
https://jmeter.apache.org/download_jmeter.cgi
2.插件管理器下載
JMeter-Plugins.org
3.創(chuàng)建線程組
線程數(shù):并發(fā)線程數(shù)
Ramp-Up時間:表示啟動所有線程需要的時間
循環(huán)次數(shù):每個線程要發(fā)送多少次請求。
調(diào)度器:循環(huán)次數(shù)與調(diào)度器選擇一個進行配置即可,持續(xù)時間填個60,就代表1分鐘

4.創(chuàng)建HTTP請求

5.創(chuàng)建監(jiān)聽器,輸出結(jié)果


性能調(diào)優(yōu)總結(jié)
上線前,可以通過Jmeter進行壓測,然后進行性能調(diào)優(yōu)。上線后,通過JDK自帶的這些性能調(diào)優(yōu)工具,進行監(jiān)測后續(xù)情況。性能調(diào)優(yōu)沒有捷徑,也沒有統(tǒng)一的參數(shù),只能自己設(shè)置參數(shù)后,使用壓測工具與監(jiān)測工具,一遍遍查看效果。