2

JProfiler是一款内存分析工具,可以实时监控当前JVM内存中存活的对象,也可以监控线程,CPU,锁等的情况。

IDEA中如何使用JProfiler?

  1. 首先下载JProfiler客户端,只安装客户端插件是不行的
    点击这里进入下载页面
  2. IDEA安装JProfiler插件
    Screen Shot 2020-03-01 at 14.42.42.png
  3. 重启IDEA插件并修改Jprofiler执行文件路径
    1)安装完了JProfiler插件之后需要重启IDEA
    2)重启之后修改JProfiler执行路径
    Screen Shot 2020-03-01 at 14.44.50.png
  4. 执行Java项目并启动JProfiler
    Screen Shot 2020-03-01 at 14.46.42.png
    Screen Shot 2020-03-01 at 14.49.33.png

    使用JProfiler分析JVM内存

    如何查看对象的GC Root?
    1. 打开Live Memory并找到观察对象
      Screen Shot 2020-03-01 at 15.57.09.png
      Screen Shot 2020-03-01 at 15.58.53.png
    2. 右键并选择Show Selection In Heap Walker
      Screen Shot 2020-03-01 at 16.02.03.png

      Screen Shot 2020-03-01 at 16.04.24.png

    3. 切换Outgoing referenceIncoming reference
      Screen Shot 2020-03-01 at 16.05.54.png
      Screen Shot 2020-03-01 at 16.07.06.png
      由此我们知道了Enhancer这个对象定义在main方法中的,而当前main方法的局部变量记录在Java虚拟机栈中,同时Java虚拟机栈是GC Root之一,所以可以确定Enhancer对象本身就是GC Root。
    4. 忽略第3步,我们可以使用另一种方式来找GC Root。右键选择 Show In Graph
      Screen Shot 2020-03-01 at 16.10.57.png
      Screen Shot 2020-03-01 at 16.13.00.png
    5. 如果第四部还没有找到GC Root,可以点击图上Show Paths To GC Root

上面的演示中JVM中运行的代码如下:

import net.sf.cglib.proxy.Enhancer;  
  
public class Main {  
  
    public static void main(String[] args) throws InterruptedException {  
        Enhancer enhancer = new Enhancer();  
  
        while(true) {  
            Thread.sleep(1000);  
        }  
    }  
  
    static class OOMObject { }  
}
如何使用JProfiler分析dump文件?
  1. 点击Start Center
    Screen Shot 2020-03-01 at 16.44.12.png
  2. 点击Open a Single Snapshot并选择dump文件
    Screen Shot 2020-03-01 at 16.46.49.png

如果没有可以使用的dump文件,可以在运行Java项目时使用jmap命令生成dump文件

  1. ps -ef | grep java 查看需要执行dump操作的Java进程
  2. jmap -dump:format=b,file=filename.hprof pid

水一水
39 声望5 粉丝

总结经验,提升自己