我在Java中开发了一些通过init.d
脚本初始化的应用程序。运行应用程序一段时间后,我发现了以下内容:
$cat /proc/[java_app_pid]/cmdline
java-Xmx256m... other options
$cat /proc/[java_app_pid]/status
...
VmHWM: 669176 kB
VmRSS: 560352 kB
...
从我可以看到,对于256 MB堆,整个驻留大小内存消耗为560MB
,HWM 669 MB
。它看起来像低效的内存利用率(HWM是堆大小的2.5倍)。
我的应用程序没有分配任何直接缓冲区(显式)。它通过NIO捕获文件系统事件并处理它们。
我的第一个想法是标题消耗了内存。但是对于64位VM记录here,它们为每个实例消耗了8个字节。它们所在的位置(堆/ offheap)在我链接的源中未指定。
我想通过gdb进行内存转储,但我不知道堆/非堆内存所在的地址空间。你能否指出一些方向来调查这个问题?