连接方式
需要java进程启动JMX服务
- 命令行输入 jvisualvm -J-Xmx8096M (可配置最大内存大小)
- 左边栏可选择本地或远程连接
- 添加主机(输入IP),添加JMX连接(添加端口号)。
实时动态分析
-
抽样器->内存。 可观察各种类实例数及内存占用。底栏有类名过滤器,可以过滤包含某些字段的类的状态。
静态 Dump 分析
- Dump内存信息:右侧点击 “堆Dump”。
本地进程会直接打开dump文件。
远程 dump 会选择 dump 文件地址,过一段时间提示 dump 完成。
可以将 dump 文件 scp 至本机,通过 文件->装入 打开 dump 文件。
打开dump文件后会有类和实例信息,点开实例后有引用信息,还可以通过OQL分析。
jmap dump工具
jmap -dump:file=heap.dump pid (pid为进程号)
OQL
这个工具太慢了,dump文件比较小还可以,大了没法忍
-
使用OQL控制台分析堆信息。 参考:https://visualvm.github.io/documentation.html
对字符串常用的分析例子:
```
select count(heap.objects('java.lang.String')) 查询String实例的个数
select s from java.lang.String s where /^_.*_.*/.test(s.toString()) 查询满足一定模式的字符串
select count(heap.classes(), "/java.io./.test(it.name)") 查询满足一定模式的类的个数
select count(heap.objects("java.lang.String"), "/^_.*_.*_.*/.test(it)") 查询满足一定模式的字符串个数
```