JProfiler 简介

JProfiler 能够监控本地或远端的 Java 进程,包括 CPU使用率、方法耗时火焰图、内存使用率、内存对象、线程状态等。

JProfiler 的 GUI 界面是他的客户端,监控的进程所在的机器叫做服务器。

JProfiler 安装

下载地址:https://www.ej-technologies.com/download/jprofiler/files

客户端和服务器安装的版本需要统一,安装包都是一样的,推荐 11.1 版本。

客户端的机器也需要安装 JDK,我安的是 JDK8。

安装时需要本地有网络,如果没有网络,他会提示输入一个 license,可以找个有网的环境输入邮箱申请试用 license。

JProfiler 安装使用教程_自动驾驶

JProfiler 监控本地

打开 JProfiler 之后会出来一个 Quick start,点 Attach to a running JVM
JProfiler 安装使用教程_服务器_02
on this computer 是本地的 Java 进程,点击进程号然后 Start
JProfiler 安装使用教程_linux_03

JProfiler 监控服务器

Direct connection to

如果本机和服务器都没有网络,只能用这种连接方式。

下载 TAR.GZ 包

https://download-gcdn.ej-technologies.com/jprofiler/jprofiler_linux_11_1_4.tar.gz

放到服务器上,tar -zxvf 解压缩之后启动监控

./bin/jpenable

JProfiler 安装使用教程_服务器_04

一路选择是,GUI,选择要监控的进程号,最后会给你一个默认端口,一直回车就可以。

在客户端这边,选择 on another computer,Direct connection to,输入IP和刚才服务器分配的端口。
JProfiler 安装使用教程_java_05

SSH tunnel

可以选择使用私钥免密登录(如果会经常访问,推荐这个),或者直接 ssh 密码登录。

需要客户端或者服务器能联网(也可能都需要联网)。
JProfiler 安装使用教程_java_06

JProfiler 安装使用教程_linux_07

输入 ssh 的用户,IP,端口,选择公钥或者一步一步执行就可以了
JProfiler 安装使用教程_linux_08

JProfiler 具体使用

看到这个图,就是连上了。

首先选择采样的精确度,越往上对进程的影响越大,越精细,不了解的可以选第二个推荐的。
JProfiler 安装使用教程_linux_09

  • JVM exit action(监控的进程退出时做的操作)
    • Let the JVM exit and disconnect:抛出连接断开,监控的图都消失
    • Keep the VM alive for profiling:阻碍进程退出,可以防止 control C 和 kill,但防不住 kill -9
    • 【推荐】Save and immediately open a snapshot:保存当前的监控快照并打开

JProfiler 安装使用教程_自动驾驶_10

Telemetries 的 Overview 可以查看系统资源使用
JProfiler 安装使用教程_java_11

内存问题排查

  • 常用的三个排查的地方
    • Instance Count:可以看内存对象个数,根据系统运行规律可以推测有无内存泄漏
    • Size:某类对象的内存占用大小,一般用来查哪个对象导致的 OOM(有内存泄漏不一定 OOM,可能泄漏的实例多,但是总大小不大)
    • Class View Filters:这个有时候很有用,分析某个特定的类的对象个数,有助于排查 bug 和那些基本不会导致 OOM 的轻微内存泄漏
    • Run GC:可以 GC 一下看看对象的变化,是否有 GC 不掉的
      JProfiler 安装使用教程_客户端_12

如果以上分析不出来 OOM 问题,可以考虑 Dump 内存,当然 jmap 也可以 dump,这个简单一些。

Heap Walker,点快照的按钮就 dump 了,dump 的时候会自动执行 GC。
JProfiler 安装使用教程_java_13

Dump 完会自动打开快照,也可以手动打开一个 jmap 的快照,之后就是分析内存对象了。

Classes 里有各个对象的实例数和内存占用,同样,可以按照 Size 排序,点一下 Size 就行了。

接下来双击一个类,然后选择 Merged incoming reference -> OK。
JProfiler 安装使用教程_自动驾驶_14
可以看到这个对象的实例数已经被谁引用了。
JProfiler 安装使用教程_java_15

CPU 问题排查

CPU recording 之后可以抽样各个方法的耗时, Stop Recordings 会停止抽样。抽样会影响进程运行,如果是线上系统,尽量抽十几秒能看出来趋势了就停掉。
JProfiler 安装使用教程_客户端_16

如果什么都没有,点 Session Settings,Call Tree Filters -> Define Filters -> 加号 -> Add profiled package or class
JProfiler 安装使用教程_服务器_17

添加监控的代码包,OK
JProfiler 安装使用教程_客户端_18

然后重新抽样,出现火焰图,可以分析了。
JProfiler 安装使用教程_自动驾驶_19