一次完整的JVM堆外内存泄漏故障排查记录( 三 )

可以看出,最下面一行是堆内存的映射,占用4G,其他上面有非常多小的内存占用,不过通过这些信息我们依然看不出问题 。
堆外内存跟踪 NativeMemoryTracking

?
Native Memory Tracking (NMT) 是Hotspot VM用来分析VM内部内存使用情况的一个功能 。我们可以利用jcmd(jdk自带)这个工具来访问NMT的数据 。
?
NMT必须先通过VM启动参数中打开,不过要注意的是,打开NMT会带来5%-10%的性能损耗 。
-XX:NativeMemoryTracking=[off | summary | detail]# off: 默认关闭# summary: 只统计各个分类的内存使用情况.# detail: Collect memory usage by individual call sites.然后运行进程,可以使用下面的命令查看直接内存:
jcmd <pid> VM.native_memory [summary | detail | baseline | summary.diff | detail.diff | shutdown] [scale= KB | MB | GB] # summary: 分类内存使用情况.# detail: 详细内存使用情况,除了summary信息之外还包含了虚拟内存使用情况 。# baseline: 创建内存使用快照,方便和后面做对比# summary.diff: 和上一次baseline的summary对比# detail.diff: 和上一次baseline的detail对比# shutdown: 关闭NMT我们使用:
jcmd pid VM.native_memory detail scale=MB > temp.txt得到如图结果:
一次完整的JVM堆外内存泄漏故障排查记录

文章插图
 

一次完整的JVM堆外内存泄漏故障排查记录

文章插图
 
上图中给我们的信息,都不能很明显的看出问题,至少我当时依然不能通过这几次信息看出问题 。
排查似乎陷入了僵局 。
山重水复疑无路在排查陷入停滞的时候,我们得到了来自WCS和SCF方面的回复,「两方都确定了他们的封装没有内存泄漏的存在」,WCS方面没有使用直接内存,而SCF虽然作为底层RPC协议,但是也不会遗留这么明显的内存bug,否则应该线上有很多反馈 。
查看JVM内存信息 jmap此时,找不到问题的我再次新开了一个沙箱容器,运行服务进程,然后运行jmap命令,看一看JVM内存的「实际配置」:
jmap -heap pid得到结果:
Attaching to process ID 1474, please wait...Debugger attached successfully.Server compiler detected.JVM version is 25.66-b17using parallel threads in the new generation.using thread-local object allocation.Concurrent Mark-Sweep GCHeap Configuration:   MinHeapFreeRatio         = 40   MaxHeapFreeRatio         = 70   MaxHeapSize              = 4294967296 (4096.0MB)   NewSize                  = 2147483648 (2048.0MB)   MaxNewSize               = 2147483648 (2048.0MB)   OldSize                  = 2147483648 (2048.0MB)   NewRatio                 = 2   SurvivorRatio            = 8   MetaspaceSize            = 21807104 (20.796875MB)   CompressedClassSpaceSize = 1073741824 (1024.0MB)   MaxMetaspaceSize         = 17592186044415 MB   G1HeapRegionSize         = 0 (0.0MB)Heap Usage:New Generation (Eden + 1 Survivor Space):   capacity = 1932787712 (1843.25MB)   used     = 1698208480 (1619.5378112792969MB)   free     = 234579232 (223.71218872070312MB)   87.86316621615607% usedEden Space:   capacity = 1718091776 (1638.5MB)   used     = 1690833680 (1612.504653930664MB)   free     = 27258096 (25.995346069335938MB)   98.41346682518548% usedFrom Space:   capacity = 214695936 (204.75MB)   used     = 7374800 (7.0331573486328125MB)   free     = 207321136 (197.7168426513672MB)   3.4349974840697497% usedTo Space:   capacity = 214695936 (204.75MB)   used     = 0 (0.0MB)   free     = 214695936 (204.75MB)   0.0% usedconcurrent mark-sweep generation:   capacity = 2147483648 (2048.0MB)   used     = 322602776 (307.6579818725586MB)   free     = 1824880872 (1740.3420181274414MB)   15.022362396121025% used29425 interned Strings occupying 3202824 bytes


推荐阅读