Java内存使用和TOP命令

问题描述

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

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

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

jvm_memory_bytes_used{area='heap'}

据我所知,如果它的堆大小一旦达到 2.3G,即使它在 JVM 内部下降到 954M,内存分配也会在这个级别。

从系统TOP命令来看,这个过程电流有2.7G的RES。

  *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 + “非堆部分”?

解决方法

你的结论大致正确。

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

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