天天看點

【jprofiler應用-oom原因定位】

1.安裝jprofiler   jprofiler_windows-x64_11_0_2.exe

【jprofiler應用-oom原因定位】

2.使用KeyGen.exe生成注冊碼然後輸入

【jprofiler應用-oom原因定位】

3.idea中安裝jprofiler插件

File-->Setting-->Plugins 搜尋jprofiler插件然後安裝

【jprofiler應用-oom原因定位】

 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應用-oom原因定位】

第一次用,它會讓你選擇之前安裝的桌面版jprofiler.exe,選擇即可。

遊戲伺服器啟動後會列印一些啟動參數:

【jprofiler應用-oom原因定位】

6.分析

1.先看下記憶體資訊,分析GC是否正常 

結論:可以看出來記憶體一直在增長,正常情況下,因為有GC,應該是先配置設定記憶體,然後GC進行記憶體回收會有下降的趨勢,也就是"波浪形"才正常: 先增加--》GC--》降低--》這樣子循環。

現在看到,并不是,而是一直在增加,說明有記憶體洩露。

【jprofiler應用-oom原因定位】

 2.看下到底是哪些對象在使用中

結論:既然懷疑有記憶體洩露,看下到底是哪些對象有洩露呢?可以看出全是1億多個Student對象,那懷疑是Student對象沒被GC掉。

【jprofiler應用-oom原因定位】

 3.看下哪些方法占據時間最長

結論:看下系統運作中,到底哪些方法占比最長,可以看出來,main占據了100%,然後看到List的add和Student的初始化占據較長。是以可以輕松定位到哪個方法有問題。

【jprofiler應用-oom原因定位】

7.儲存快照 // 點選save  snapshot就可以儲存下來快照,讓别人一起分析

【jprofiler應用-oom原因定位】

輸入要儲存的名字,這裡随便輸入1:

【jprofiler應用-oom原因定位】

8.别人輕按兩下生成的1.jps就可以使用jprofiler重新載入檔案,進而别人也一起分析問題。

總結:

可以看出來jprofiler功能很強大,基本上壓測時,就可以使用這個工具,分析出熱點代碼和記憶體相關的資料進而定位問題。

jprofiler的功能還有很多,比如:鎖之類的,之後有經驗了,再進行補充吧!!!