JVM 的堆大小不断增加(但 usedMemory() 不断减少)

Posted

技术标签:

【中文标题】JVM 的堆大小不断增加(但 usedMemory() 不断减少)【英文标题】:JVM's heap size keeps increasing (but usedMemory() keeps decreasing) 【发布时间】:2019-10-29 16:41:44 【问题描述】:

我有一个在 eJDK 1.8.201 上运行的 Java 应用程序。我观察到系统报告的java进程的RSS使用率不断增加,它将达到物​​理内存512M的90%以上,我的代码将重新启动系统。另一方面,我定期从代码中打印出的usedMemory() 表明它始终在不超过物理内存的 37% 的有限范围内波动(意味着 190M)。据我了解,这意味着 JVM 没有将其可用内存返回给操作系统。这种理解正确吗?我设置了-Xmx=256M -Xms=256M,所以我认为-Xmx 选项不起作用。

您对发生的事情以及如何解决问题有任何想法吗?

该系统是ARMv7板上的嵌入式Linux。

【问题讨论】:

看来越来越大的内存消耗不是堆内存。 如果不是堆,那是什么?谢谢 有不同的可能性,堆栈、直接缓冲区、代码缓存、只是本机代码分配的内存等 它很可能被堆外内存消耗waitingforcode.com/off-heap/on-heap-off-heap-storage/read 您应该检查您的依赖关系并查看它们的堆外内存使用情况 我知道在jdk中有一些工具可以dump heap,比如jhat、jcmd。有人知道 ejdk 中是否有任何工具(来自 oracle 的嵌入式 JDK)可以让我转储并分析增加的内存在哪里使用?谢谢。 【参考方案1】:

-Xmx=512M-Xms=512M 是无效标志。应将它们更改为 -Xmx512M-Xmx512M

【讨论】:

以上是关于JVM 的堆大小不断增加(但 usedMemory() 不断减少)的主要内容,如果未能解决你的问题,请参考以下文章

已用堆大小不断增加

减少 JVM 中未使用的堆大小

用更大的堆空间重新启动 JVM

Android中JVM的堆大小[重复]

kafka如何做到磁盘读写比内存读写还快?

在运行时更改Jmeter的堆大小