【问题标题】:Where is the memory leak in this Java scenario?这个 Java 场景中的内存泄漏在哪里?
【发布时间】:2019-06-03 18:13:29
【问题描述】:

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

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 不知道的内存中的东西。

谢谢。

【问题讨论】:

    标签: java memory-leaks


    【解决方案1】:

    恐怕你必须调试这个问题,没有办法知道你的服务器上正在运行什么。

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

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

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

    【讨论】:

    • 谢谢。我已经将 Xmx 和 Xms 设置为 10240m。元空间是一个很大的帮助,将研究这一点!谢谢你。如果做不到这一点,将尝试找出什么在使用堆外内存。
    猜你喜欢
    • 1970-01-01
    • 2010-11-17
    • 2012-05-22
    • 2011-01-01
    • 1970-01-01
    相关资源
    最近更新 更多