gpt4 book ai didi

java - 这个Java场景内存泄漏在哪里呢?

转载 作者:行者123 更新时间:2023-12-02 09:49:16 24 4
gpt4 key购买 nike

我正在主机上使用 Java 应用程序,该应用程序内存不足并导致 JVM 崩溃。

JVM为8。例如,我在16GB主机(运行Linux)上将Xms和Xmx设置为10240m。随着时间的推移,我监控 JVM 堆(例如使用 JMX 或 java 代理)并且使用情况保持一致且在范围内。 GC定期运行并进行清理,并且没有任何内存空间随着时间的推移有上升趋势。

但在主机操作系统上,我通过 ps 监控内存使用情况 - vsizesize 参数保持一致,但 pmem 随着时间的推移而增加(我认为 rss 也是如此,但才刚刚开始监控它)。 pmem 使用率达到 99%,然后 jvm 无法分配内存并退出。我怀疑 rss 会随着时间的推移而增加(它已经开始朝着这个方向发展)。

这是否表明 JVM 运行的 Java 应用程序存在内存泄漏?我认为 JVM 本身不太可能存在内存泄漏。而且在 -javaagent 上运行的代理已经被广泛使用,所以也不要认为是这样。这是一个好的猜测吗?如果是基于应用程序的内存泄漏,什么类型的内容可能会泄漏,或者找到它的好方法是什么?像 JMX 这样的东西似乎并没有泄露任何东西,看起来它是在 JVM 不知道的内存中分配的东西。

谢谢。

最佳答案

恐怕您将不得不调试这个问题,没有办法知道您的服务器上正在运行什么。

您可以通过使用 -Xms10240m 启动选项预分配 JVM 堆内存来改善这种情况。如果 -Xms 等于 -Xmx,则 JVM 堆内存将不会调整大小。

由于您使用的是 Java 8,因此您应该检查 Metaspace memory利用率。默认情况下没有限制,因此错误的类加载器可能会泄漏内存。您可以设置-XX:MaxMetaspaceSize=512m启动选项。

第三个可能的罪魁祸首是使用堆外内存的第三方库,例如一些缓存库直接访问 JVM 堆外部的内存。

关于java - 这个Java场景内存泄漏在哪里呢?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56432525/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com