微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

Java内存使用和TOP命令

如何解决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 何时将内存释放回操作系统以及如何调整。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。