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