jvm内存诊断全集
jvm内存诊断一直是一个强需求,大家能马上想到mat等工具,在诊断heap,metaspace,直接内存上是有奇效。但是介绍能解决jvm的一部分问题。 下面就来一套,全面诊断的方式。 利用nmt找出泄漏区域 java有NativeMemoryTracking帮助我们查看jvm带来的内存分配问题,这个只能看jvm带来的,如果是jni的调用申请的内存,那这个工具是没有用的。那大家可能疑惑了,那这个工具也没想象的那么有用,java各种分区,堆的,非堆的,还有直接内存的值jmx都有,想排查是否是jvm带来的似乎也可以做到。那NativeMemoryTracking的作用是什么呢? 对比现有的工具 查看内存数据的工具其实很多,我们通过NativeMemoryTracking和他们进行一下比较。 ||jstat|NativeMemoryTracking|jmx| |-|-|-|-| |是否支持命令行观察|支持|支持|不支持| |是否支持直接内存|不支持|支持|支持| |是否支持unsafe的分配|不支持|支持|不支持| 对比的最后一项,很多人可能就要提出疑问,直接内存不就是利用unsafe分配的吗,那这里怎么还写了jmx不支持呢。 直接内存的使用其实是DirectByteBuffer自己维护的内存计数。也就是这个直接内存的数据其实是java code自己维护出来的,只要跳过这些