使用JVMTI在运行时经引用关系遍历堆内对象,统计各个类的实例占用的堆内存、各个对象占用的堆内存,从而得到占用内存最大的若干个类和对象。使用JVMTI遍历对象时所建立的引用关系图,可以回溯特定类的占用内存最大的对象的引用关系,帮助定位对象。同时,对与之相关的文档和在线教程进行补充。
运行命令和效果如下:
$ vmtool -a heapAnalyze --classNum 5 --objectNum 3
class_number: 4101
object_number: 107299
id #bytes class_name
----------------------------------------------------
1 209715216 byte[]
2 104857616 byte[]
3 524304 char[]
id #instances #bytes class_name
----------------------------------------------------
1 7043 327124360 byte[]
2 20303 5660096 char[]
3 2936 631136 java.lang.Object[]
4 20270 486480 java.lang.String
5 4110 462904 java.lang.Class
$ vmtool -a referenceAnalyze --className ByteHolder --objectNum 2 --backtraceNum -1
id #bytes class_name & references
----------------------------------------------------
1 16 ByteHolder <-- root(local variable in method: main)
2 16 ByteHolder <-- root(local variable in method: sleep)