有没有办法查看NIO缓冲区的内存使用情况? JConsole中有非堆内存部分,但我认为这不包括NIO缓冲区吗?
操作系统是Linux(Ubuntu或CentOS),如果这很重要。
的问候,
维姆
答案 0 :(得分:3)
值得注意的是,直接内存缓冲区仅使用与您使用的物理内存一样多(对于下一页大小,通常为4K)。它们在创建时使用虚拟内存但操作系统非常智能,在您使用直接内存缓冲区中的页面之前不会分配物理内存页(驻留)。这意味着所使用的物理内存大小可能小于您分配的内存量(虚拟)。物理/驻留记忆是你应该关心的。
这样做的好处是你可以分配几MB的缓冲区,即使你只想使用几KB而且它只会使用你使用的数量,如果由于某种原因你需要更多,你的程序不会爆炸。即你没有必要正确的尺寸,并且可以相当安全地估计分配的尺寸。
答案 1 :(得分:1)
是的,从linux通过ps
命令。例如:
ps x -o command,rss | grep java | grep latest | cut -b 17-
输出将以KB为单位。
您可能对我有一段时间关于Java,RSS和NIO缓冲区的问题感兴趣: Why does the Sun JVM continue to consume ever more RSS memory even when the heap, etc sizes are stable?
答案 2 :(得分:0)
我用它来监视虚拟和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使用的所有内存,虽然这个小脚本已经证明我有用到看到我正在调查的程序中没有内存泄漏。