匯智動力-JAVA性能優(yōu)化工具
好記性不如爛筆頭,戊戌年的最后一個工作日,把自己平時在開發(fā)過程中使用的一些java性能優(yōu)化工具做一個簡單的小結,
主要包括 jvisualvm、jfr、gdb和查看內存對象信息的幾個linux命令。
注:當前系統(tǒng)屬性 Mac OS X 10.13.6,jdk版本 1.8.0_151
1:jvisualvm(當前java自帶的工具)

可以看到jvisualvm不僅支持本地應用程序的追蹤還支持遠程。
然后打開對應的本地項目:

這里面確實有很多項目的信息,CPU、堆棧信息等。

我目前使用它就是用它的抽樣器,查看當前項目里的對象數(shù)及對象占用的內存大小。

這樣對項目中某個對象個數(shù)過多或者對象過大,就可以方便的查看到,然后去優(yōu)化它。
2:JFR
jfr的優(yōu)點:
VisualVM功能強大,支持圖形化界面操作,可以很快定位代碼問題。但是它對應用性能的影響也非常大,所以不適合在生產環(huán)境下使用。
還有這些軟件(比如GDB(下面介紹))要attach到jvm進程上,生產環(huán)境一般網絡隔離,很難做到。
使用jfr不需要在現(xiàn)有應用上額外添加任何參數(shù)、重啟進程等,直接在命令行執(zhí)行即可,實時生效,100%無入侵,且穩(wěn)定可靠,不影響線上應用運行。
jfr的使用:
2.1:本地使用:
1:需要在項目jvm加上配置 vm options:-XX:+UnlockCommercialFeatures -XX:+FlightRecorder
2:打開jmc
3:打開對應的進程ID,就可以追蹤本項目的堆棧、CPU等信息

2.2:在服務器上使用:
1:由于JFR需要JDK的商業(yè)證書,這一步需要解鎖jdk的商業(yè)特性:
jcmd
2:啟動jrf,開始輸出jfr文件
jcmd
3:拿到jfr文件后,在本地打開jmc圖形化工具后,選擇文件直接打開,然后就可以看到服務器上duration時間間隔的項目信息。
當然無論是本地運行還是在服務器上運行,Java飛行記錄器都支持創(chuàng)建一個模板。

在高級模式中,你可以自定義自己想要的信息。

創(chuàng)建好模板后,無論是在本地還是復制到遠程服務器上,
jcmd
settings=template.jfc就可以指定使用templayte.jfc這個模板的配置去收集項目信息。
3:GDB
首先機器上需要安裝gdb,gdb的安裝就不贅述了,
sudo apt-get install gdb
sudo yum install gdb
brew install gdb
1:使用gdb生成java heap文件
1.1:生成進程core文件
sudo gdb -p
. . .bunch of info. . .
(gdb)gocre /tmp/jvm.core
Saved corefile /tmp/jvm.core
(gdb) detach
(gdb) quit
1.2:根據core文件生成java heap文件
sudo jmap -dump:format=b,file=/tmp/jvm.hprof /usr/bin/java (自己機器java路徑) /tmp/jvm.core
2:運行MAT找出內存泄漏根源

點擊finish,然后就可以看到當前java進程的堆棧信息。