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的功能还有很多,比如:锁之类的,之后有经验了,再进行补充吧!!!



















