【发布时间】:2010-04-22 10:17:57
【问题描述】:
有没有办法查看 NIO 缓冲区的内存使用情况? JConsole中有非堆内存部分,但我认为这不包括NIO缓冲区?
如果需要的话,操作系统是 Linux(Ubuntu 或 CentOS)。
问候,
维姆
【问题讨论】:
有没有办法查看 NIO 缓冲区的内存使用情况? JConsole中有非堆内存部分,但我认为这不包括NIO缓冲区?
如果需要的话,操作系统是 Linux(Ubuntu 或 CentOS)。
问候,
维姆
【问题讨论】:
值得注意的是,直接内存缓冲区仅使用与您使用的物理内存一样多的物理内存(到下一页大小,通常为 4K)。它们在创建时使用虚拟内存,但操作系统足够聪明,不会分配物理内存(常驻)页面,直到您使用直接内存缓冲区中的页面。这意味着使用的物理内存的大小可以小于您分配的内存量(虚拟)。物理/常驻内存是您应该关心的。
这样做的好处是您可以分配几 MB 缓冲区,即使您只希望使用几 KB 并且它只会使用您使用的数量,如果由于某种原因您需要更多,您的程序不会崩溃.即,您不必获得正确的大小,并且可以相当安全地高估分配的大小。
【讨论】:
是的,从 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?
【讨论】:
我用它来监控虚拟和 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 使用的所有内存,尽管这个小脚本已经证明我足够有用,可以看到我正在调查的程序中没有内存泄漏。
【讨论】: