问题描述
我正在尝试了解一些系统内存概念。
如果我有一个 Java 程序并且它的最大堆大小是 5657m
其堆使用的大小如下:(大约在 954M ~ 2.3G 之间)
据我所知,如果它的堆大小一旦达到 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***
所以我可以得出结论:
-
RES 2.7G = 此 Java 进程“当前已达到的最大堆大小”+“非堆部分”大小?
-
既然 Heap 达到了 2.3G,那么 RES 永远不会低于 2.3G 吗?
-
由于最大堆是 5657m,那么 RES 的最大值 = 5657m + “非堆部分”?
解决方法
你的结论大致正确。
然而,#2 有一个错误:JVM 可以将内存返回给操作系统,因此 RES 值可以缩小。但是默认情况下,JVM 非常不愿意这样做(以至于除非您明确配置,否则很难看到它)。
This SO question 有一个详细的答案,显示了不同版本的 OpenJDK 何时将内存释放回操作系统以及如何调整。