分析工具:
jprofiler
官网 收费
JProfiler's intuitive UI helps you resolve performance bottlenecks,
pin down memory leaks and understand threading issues.
jprofiler 提供了简单易用的UI界面,帮助解决性能问题,确定内存泄漏,解决线程问题。
When it comes to profiling, only the best tool is good enough.
只有准备好了 优秀的工具,才是足够好。
可以看出,jprofiler 的定位:是一款 简单好用的 内存分析工具。
jprofiler 可以看到实施的内存、GC、CPU、线程的活动状态,UI界面也比较友好。就是 收费。
jvisualvm.exe、jconsole.exe
这两是 JDK自带的 内存检测工具。只是 UI界面 不太友好。
jprofiler 可以算是 这两的 升级版本。
MAT Memory Analyzer Tool
下载地址:
Eclipse Memory Analyzer Open Source Project | The Eclipse Foundation
分析 JVM dump 文件 最好的工具。他可以 根据 dump文件 ,提示出 可能存在的问题,比如 哪些对象占用过多,并且可以分析出这些过多内存的 引用路径,对于分析问题 非常有帮助
注意事项:
1. jprofiler 实时内存 显示的对象 个数,是包含 存活对象和非存活对象的。 如果对象引用不可达,但是此时 没有发生GC时,也会被统计到对象个数中。
跟 jmap -histo pid 统计的数据一致。
2. jvisualvm.exe 工具自带了一个 dump按钮,如果点击了 Dump按钮,会触发一次GC活动
3. MAT Memory Analyzer Tool 分析工具,分析的dump文件,可能是只包含存活对象。
就目前知道的 jmap -dump 命令 生成的 dump 文件,是只包含存活对象,即使 不存活的对象没有被GC回收,也不会输出到dump文件
4. 分析内存占用过的
内存占用过的,是一种结果。导致这个结果的原因:
1. 仍然存活的 对象 占据的内存
2. 已经die的对象 占据的内存
die的对象 占据的内存 会在未来某个时间 被GC 回收。
如果确定存活的对象 占据内存 依然居高不下,就要考虑:
1. 确实 需要 创建这些大量的对象,这种原因的话,就需要 避免 需要创建大量对象的 情况发生
2. 发生了 内存泄漏
所以,如果JVN内存占用过多,可能是 GC 没有触发,导致 引用不可达的对象 没有及时被回收。如果 用 jprofiler 分析问题的话,需要关注 GC 活动情况。如果GC后,内存仍然占用过的,就需要具体分析是否内存泄漏还是其他问题。