第二篇字節碼和類加載篇感覺用處不大,暫時跳過,直接開始性能監控和調優。但是是免費篇,講的都是寫工具、參數,實際案例比較少。
視頻地址:
https://www.bilibili.com/video/BV1PJ411n7xZ?p=381&vd_source=510ec700814c4e5dc4c4fda8f06c10e8
🔥1.性能監控與調優篇
分爲性能監控(發現問題)、分析(排查問題)和調優(解決問題):最終目的還是要減少GC次數,保證系統性能
1.1. 性能監控
1.1.1 命令行監控
1.1.1.1 jps
java process status
-- 查看Hotspot虛擬機中正在運行的進程: pid 進程名
C:\Users\EDY>jps
18736 Jps
26500 RemoteMavenServer36
14712 RemoteMavenServer36
21452 Launcher
39372
46956 Launcher
1.1.1.2 jstat
監視虛擬機中運行狀態:類加載,內存,垃圾收集等運行數據
C:\Users\EDY>jstat -class 26500
Loaded Bytes Unloaded Bytes Time
5740 10533.0 25 25.2 2.23
1.1.1.3 jinfo
查看、調節虛擬機配置參數信息
--查看進程參數,也可以修改
C:\Users\EDY>jinfo -flags 42872
--增加參數
C:\Users\EDY>jinfo -flag +PrintGCDetails 42872
1.1.1.4 JVM默認值
--JVM啓動默認值
C:\Users\EDY>java -XX:+PrintFlagsInitial >> 1.txt
--JVM最終默認值,可能程序會修改
C:\Users\EDY>java -XX:+PrintFlagsFinal >> 1.txt
1.1.1.5 Jmap
導出內存映像文件和內存使用情況
1.1.2 GUI界面
GUI算是對命令行的升級。分爲JDK自帶和第三方工具
1.1.2.1 Jconsole
1.1.2.1 JvisualVM
dump文件:分析某個時刻內存、類個數、對象個數等信息情況
抽樣器:查看哪個線程佔用CPU和內存過高的情況
.hprof:就是dump裏面對象個數情況
淺堆:對象所消耗內存,不包含內部引用對象大小
深堆:只能通過一個對象直接或間接訪問到所有對象的淺堆之和(比如A對象中有多個對象,對象下面還有對象,A中除去多個對象後的大小就是淺堆,整個A對象包含多個對象下面的對象就是深堆,)
實際對象大小:對象中所有對象之和
1.1.3 JProfile(略)
就是和idea整合的內存分析工具
1.1.4 Arthas(略)
1.2 性能分析
1.2.1 內存泄漏
1.2.1.1 static集合
長生命週期引用持有短生命週期對象導致不能被回收,就會導致內存泄漏
//statics生命週期和JVM一致, 程序結束之前不能被釋放
static List list = new ArrayList();
public static void staticCollection(){
Object o = new Object();
list.add(o);
}
1.2.1.2 單例模式
單例對象持有外部對象引用
1.2.1.3 外部連接
數據庫連接,網絡連接,IO連接,連接完了之後要關閉
1.2.1.4 變量作用域
能用局部變量的不要用全局變量
1.2.1.5 hashCode值
set.add一個對象後再把這個對象屬性修改add,就會有2個相同屬性的對象(因爲剛開始計算hashcode是一個值,修改屬性就會重新計算hashcode,因爲底層是map,map存儲元素就是拿hashcode來計算的),前一個對象就會造成內存泄漏,所以對於集合存了元素後,就不要再修改元素裏面值了,類似redis和mysql關係
1.3 性能調優
1.3.1 JVM參數設置(略)
第一篇講了很多了,後面用到了在看。分爲-X(穩定)與-XX(不怎麼穩定)
1.3.2 GC日誌分析(略)
1.4 個人小結
總結,總的來說,本章分爲一些命令行監控、GUI監控、第三方工具監控、JVM參數設置和日誌監控,來分析代碼寫的是不是有問題,服務器配置是不是不行之類的。