有没有办法查看 NIO 缓冲区的内存使用情况?JConsole 中有非堆内存部分,但我认为这不包括 NIO 缓冲区?
如果重要的话,操作系统是 Linux(Ubuntu 或 CentOS)。
问候,
维姆
值得注意的是,直接内存缓冲区仅使用与您使用的物理内存一样多的物理内存(到下一页大小,通常为 4K)。它们在创建时使用虚拟内存,但操作系统足够聪明,不会分配物理内存(常驻)页面,直到您使用直接内存缓冲区中的页面。这意味着使用的物理内存的大小可以小于您分配的内存量(虚拟)。物理/常驻内存是您应该关心的。
这样做的好处是即使您只希望使用几 KB 也可以分配几 MB 缓冲区,并且它只会使用您使用的数量,如果由于某种原因您需要更多,您的程序不会崩溃。即,您不必获得正确的大小,并且可以相当安全地高估分配的大小。
是的,从 linux 通过ps
命令。例子:
ps x -o command,rss | grep java | grep latest | cut -b 17-
输出将以 KB 为单位。
您可能对我不久前提出的关于 Java、RSS 和 NIO 缓冲区的问题感兴趣:为什么即使堆等大小稳定,Sun JVM 仍会继续消耗更多的 RSS 内存?
我用它来监视虚拟和 RSS 内存以及本机线程的数量:
for((i=0;;++i)) { echo $i ` grep VmSize /proc/\21009/status | grep -o '[0-9]*'` ` grep VmRSS /proc/\21009/status | grep -o '[0-9]*'` ` grep Threads /proc/\21009/status | grep -o '[0-9]*'` ; sleep 1 || break; } > data
它会创建一个以空格分隔的文件,您可以轻松地将其导入您喜欢的电子表格工具中。
当然,您需要将 21009 替换为您要监视的 java 进程的进程 id。
这并没有完全回答我自己的问题,因为我希望能够查看 NIO 分配的内容,而不是 JVM 使用的所有内存,尽管这个小脚本已经证明我足够有用,可以看到没有我正在调查的程序中的内存泄漏。