【问题标题】:How to see the memory usage of NIO buffers?如何查看 NIO 缓冲区的内存使用情况?
【发布时间】:2010-04-22 10:17:57
【问题描述】:

有没有办法查看 NIO 缓冲区的内存使用情况? JConsole中有非堆内存部分,但我认为这不包括NIO缓冲区?

如果需要的话,操作系统是 Linux(Ubuntu 或 CentOS)。

问候,

维姆

【问题讨论】:

    标签: java nio jconsole


    【解决方案1】:

    值得注意的是,直接内存缓冲区仅使用与您使用的物理内存一样多的物理内存(到下一页大小,通常为 4K)。它们在创建时使用虚拟内存,但操作系统足够聪明,不会分配物理内存(常驻)页面,直到您使用直接内存缓冲区中的页面。这意味着使用的物理内存的大小可以小于您分配的内存量(虚拟)。物理/常驻内存是您应该关心的。

    这样做的好处是您可以分配几 MB 缓冲区,即使您只希望使用几 KB 并且它只会使用您使用的数量,如果由于某种原因您需要更多,您的程序不会崩溃.即,您不必获得正确的大小,并且可以相当安全地高估分配的大小。

    【讨论】:

      【解决方案2】:

      是的,从 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?

      【讨论】:

      • 感谢链接,非常有趣!
      【解决方案3】:

      我用它来监控虚拟和 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 使用的所有内存,尽管这个小脚本已经证明我足够有用,可以看到我正在调查的程序中没有内存泄漏。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2017-04-28
        • 1970-01-01
        • 2010-11-16
        • 2012-07-22
        相关资源
        最近更新 更多