文章目录
JProfiler 能够监控本地或远端的 Java 进程,包括 CPU使用率、方法耗时火焰图、内存使用率、内存对象、线程状态等。
JProfiler 的 GUI 界面是他的客户端,监控的进程所在的机器叫做服务器。
JProfiler 安装下载地址:https://www.ej-technologies.com/download/jprofiler/files
客户端和服务器安装的版本需要统一,安装包都是一样的,推荐 11.1 版本。
客户端的机器也需要安装 JDK,我安的是 JDK8。
安装时需要本地有网络,如果没有网络,他会提示输入一个 license,可以找个有网的环境输入邮箱申请试用 license。
JProfiler 监控本地打开 JProfiler 之后会出来一个 Quick start,点 Attach to a running JVM
on this computer 是本地的 Java 进程,点击进程号然后 Start
Direct connection to
如果本机和服务器都没有网络,只能用这种连接方式。
下载 TAR.GZ 包
https://download-gcdn.ej-technologies.com/jprofiler/jprofiler_linux_11_1_4.tar.gz
放到服务器上,tar -zxvf 解压缩之后启动监控
./bin/jpenable
一路选择是,GUI,选择要监控的进程号,最后会给你一个默认端口,一直回车就可以。
在客户端这边,选择 on another computer,Direct connection to,输入IP和刚才服务器分配的端口。
SSH tunnel
可以选择使用私钥免密登录(如果会经常访问,推荐这个),或者直接 ssh 密码登录。
需要客户端或者服务器能联网(也可能都需要联网)。
输入 ssh 的用户,IP,端口,选择公钥或者一步一步执行就可以了
看到这个图,就是连上了。
首先选择采样的精确度,越往上对进程的影响越大,越精细,不了解的可以选第二个推荐的。
- 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:保存当前的监控快照并打开
Telemetries 的 Overview 可以查看系统资源使用
内存问题排查
- 常用的三个排查的地方
- Instance Count:可以看内存对象个数,根据系统运行规律可以推测有无内存泄漏
- Size:某类对象的内存占用大小,一般用来查哪个对象导致的 OOM(有内存泄漏不一定 OOM,可能泄漏的实例多,但是总大小不大)
- Class View Filters:这个有时候很有用,分析某个特定的类的对象个数,有助于排查 bug 和那些基本不会导致 OOM 的轻微内存泄漏
- Run GC:可以 GC 一下看看对象的变化,是否有 GC 不掉的
如果以上分析不出来 OOM 问题,可以考虑 Dump 内存,当然 jmap 也可以 dump,这个简单一些。
Heap Walker,点快照的按钮就 dump 了,dump 的时候会自动执行 GC。
Dump 完会自动打开快照,也可以手动打开一个 jmap 的快照,之后就是分析内存对象了。
Classes 里有各个对象的实例数和内存占用,同样,可以按照 Size 排序,点一下 Size 就行了。
接下来双击一个类,然后选择 Merged incoming reference -> OK。
可以看到这个对象的实例数已经被谁引用了。
CPU 问题排查
CPU recording 之后可以抽样各个方法的耗时, Stop Recordings 会停止抽样。抽样会影响进程运行,如果是线上系统,尽量抽十几秒能看出来趋势了就停掉。
如果什么都没有,点 Session Settings,Call Tree Filters -> Define Filters -> 加号 -> Add profiled package or class
添加监控的代码包,OK
然后重新抽样,出现火焰图,可以分析了。