Java 堆内存工具jmap
打印当前 Java 堆内存信息
jmap -histo[:live] <pid>
# 打印当前进程中类实例信息
导出Java 堆内存到文件
jmap -dump:live,format=b,file=heap.bin <pid>
# live 是否只打印存活对象,如果不指定,则会打印全部对象
# file 指定导出的文件路径,包含文件名称
# <pid> 指定 java 进程id
jmap -dump:live,format=b,file=heap.hprof 2848
Java 堆内存分析工具jhat
通过 jhat
命令我们可以建立一个服务器用于分析指定的堆内存文件
jhat [-port <port>] -J<flag> <file>
# jhat 指定要分析的堆内存文件
jhat -port 7000 -JXmx=1g heap.hprof
# -port 用于指定端口号,默认 7000
# -JXmx=1g 用于指定启动的Java服务,注意这里要大于dump的堆内存文件
# heap.hprof dump 出的堆内存文件
Java 对内存分析语言 OQL
我们可以通过 OQL
对象分析语言来对内存进行分析操作.
OQL
语言的标准格式是这样的:
select <JavaScript expression to select>
[ from [instanceof] <class name> <identifier>
[ where <JavaScript boolean expression to filter> ] ]
-- 获取堆内存中全部字符串
-- 注意 select,from 等关键字要用小写
select x.value.toString() from java.lang.String x
-- 正则表达式查起来会很慢,最好不要用
select x.value.toString() from java.lang.String x
where /[\d\.]+/.test(x.value.toString())
使用 & 进行多条件查询
-- 查询字符串长度大于20且包含 Excepton 的字符串
-- select 展示多个值要用数组的方式拼接
select [s.value.toString(),s]
from java.lang.String s
where s.value.length>20 & /Exception/.test(s.value.toString())
参考资料
分析大文件Java堆内存快照
分析大文件Java堆内存快照
白灰——软件测试
JVM 对象查询语言(OQL)
Object Query Language (OQL)