-XX:NativeMemoryTracking=detailJVM参数重启项目,使用命令jcmd pid VM.native_memory detail查看到的内存分布如下:
jcmd
jcmd命令显示的内存包含堆内内存、Code区域、通过unsafe.allocateMemory和DirectByteBuffer申请的内存,但是不包含其他Native Code(C代码)申请的堆外内存
gperftools
gperftools原理就使用动态链接的方式替换了操作系统默认的内存分配器(glibc)
strace
使用命令“strace -f -e”brk,mmap,munmap” -p pid”追踪向OS申请内存请求
GDB
使用命令gdp -pid pid进入GDB之后,然后使用命令dump memory mem.bin startAddress endAddressdump内存,其中startAddress和endAddress可以从/proc/pid/smaps中查找。然后使用strings mem.bin查看dump的内容
jstack
使用命令jstack pid去查看线程栈,找到对应的线程栈(注意10进制和16进制转换)