【问题标题】:Java memory usage and TOP commandJava 内存使用和 TOP 命令
【发布时间】:2021-08-10 08:14:48
【问题描述】:

我正在尝试理解一些系统内存概念。

如果我有一个 Java 程序并且它的最大堆大小是 5657m

它的堆使用大小如下:(大约在954M ~ 2.3G之间)

据我了解,如果它的堆大小一旦达到 2.3G,即使它在 JVM 内部下降到 954M,内存分配也会处于这个水平。

从系统 TOP 命令来看,这个进程的 RES 为 2.7G。

  *PID USER      PR  NI    VIRT    **RES**    SHR S  %CPU **%MEM**     TIME+ COMMAND*

*13523 cloud-u+  20   0   13.8g   **2.7g**   7000 S   5.6  **8.7***

所以我可以得出结论:

  1. RES 2.7G = 此 Java 进程“当前已达到的最大堆大小”+“非堆部分”大小?

  2. 既然Heap曾经达到2.3G,那么RES永远不会低于2.3G?

  3. 由于最大堆是5657m,所以RES的最大值=5657m +“非堆部分”?

【问题讨论】:

    标签: java memory-management


    【解决方案1】:

    你的结论大致正确。

    然而,#2 中存在一个错误:JVM 可以将内存返回给操作系统,因此 RES 值可以缩小。但默认情况下,JVM 非常不愿意这样做(除非您明确配置,否则很难看到它)。

    This SO question 有一个详细的答案,显示了不同版本的 OpenJDK 何时将内存释放回操作系统以及如何调整。

    【讨论】:

      猜你喜欢
      • 2015-07-25
      • 2012-08-20
      • 2010-11-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多