JVM的堆大小持续增加(但usedMemory()却在减少)

6
我有一个运行在 eJDK 1.8.201 上的 Java 应用程序。我发现系统报告的 Java 进程的 RSS 使用量不断增加,它将达到超过物理内存的 90%,即 512M,并且我的代码会重新启动系统。另一方面,我从代码中定期打印出的 usedMemory() 始终在有限范围内波动,不超过物理内存的 37%(即 <= 190M)。根据我的理解,这意味着 JVM 没有将其空闲内存返回给操作系统。这个理解正确吗?我已经设置了 -Xmx=256M -Xms=256M,所以我认为 -Xmx 选项没有起作用。
你有什么想法可以解决这个问题吗?
该系统是嵌入式 Linux 在 ARMv7 板上。

2
似乎内存消耗增加并不是堆内存。 - Holger
2
有不同的可能性,例如堆栈、直接缓冲区、代码缓存、本地代码分配的内存等。 - Holger
我知道在jdk中有一些工具可以转储堆,比如jhat、jcmd。请问是否有任何工具在ejdk(来自oracle的嵌入式JDK)中可以让我获取转储并分析增加的内存使用情况?谢谢。 - Woody Wu
抱歉,也许我错了,freeMemory()不应该增加。因此,off-heap内存仍有可能泄漏。请有经验的开发者给我一些建议,如何在eJDK或eJRE环境下分析off-heap内存。提前致谢。 - Woody Wu
在Java 8中,PermGen被替换为Metaspace。我之前遇到了一个问题,即在运行时加载动态Groovy类会导致Metaspace不断增长。默认情况下没有设置最小的Metaspace。这值得进一步研究。 - Garreth Golding
显示剩余4条评论
1个回答

0

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


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接