1.安裝jprofiler jprofiler_windows-x64_11_0_2.exe
2.使用KeyGen.exe生成注冊碼然後輸入
3.idea中安裝jprofiler插件
File-->Setting-->Plugins 搜尋jprofiler插件然後安裝
4.以一個記憶體溢出的程式為例子進行分析(一直配置設定記憶體,List容器引用着Student導緻無法釋放)
Student.java
package com.mydog.noval.model;
public class Student {
private int age;
public Student(int age) {
this.age = age;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
}
GameServer.java
package com.mydog.noval;
import com.mydog.noval.model.Student;
import java.util.ArrayList;
import java.util.List;
public class GameServer {
public static void main(String[] args) {
List<Student> list = new ArrayList<>();
int i = 0;
while (true) {
list.add(new Student(i++));
}
}
}
5.通過jprofiler啟動遊戲伺服器 // 可以看到在指定入口函數後,idea中jpofiler按鈕是亮着的
第一次用,它會讓你選擇之前安裝的桌面版jprofiler.exe,選擇即可。
遊戲伺服器啟動後會列印一些啟動參數:
6.分析
1.先看下記憶體資訊,分析GC是否正常
結論:可以看出來記憶體一直在增長,正常情況下,因為有GC,應該是先配置設定記憶體,然後GC進行記憶體回收會有下降的趨勢,也就是"波浪形"才正常: 先增加--》GC--》降低--》這樣子循環。
現在看到,并不是,而是一直在增加,說明有記憶體洩露。
2.看下到底是哪些對象在使用中
結論:既然懷疑有記憶體洩露,看下到底是哪些對象有洩露呢?可以看出全是1億多個Student對象,那懷疑是Student對象沒被GC掉。
3.看下哪些方法占據時間最長
結論:看下系統運作中,到底哪些方法占比最長,可以看出來,main占據了100%,然後看到List的add和Student的初始化占據較長。是以可以輕松定位到哪個方法有問題。
7.儲存快照 // 點選save snapshot就可以儲存下來快照,讓别人一起分析
輸入要儲存的名字,這裡随便輸入1:
8.别人輕按兩下生成的1.jps就可以使用jprofiler重新載入檔案,進而别人也一起分析問題。
總結:
可以看出來jprofiler功能很強大,基本上壓測時,就可以使用這個工具,分析出熱點代碼和記憶體相關的資料進而定位問題。
jprofiler的功能還有很多,比如:鎖之類的,之後有經驗了,再進行補充吧!!!