【问题标题】:Total (Tomcat) memory increasing but heap doesn't总(Tomcat)内存增加但堆没有
【发布时间】:2016-01-26 07:20:38
【问题描述】:

这些是在服务器上为 tomcat 设置的内存选项: -Xmx64g -Xms8g -XX:PermSize=768m -XX:MaxPermSize=768m

在过去 1 个月中,操作系统 (Linux) 上的总内存从 67GB 增加到 95GB,这是一个缓慢但渐进的增长。 (我现在唯一的信息是 zabbix(监控工具)显示自服务器重启以来的内存使用历史记录)

在此服务器上运行的唯一(用户)应用程序是 tomcat。

同样的 zabbix 工具还显示了与 8GB 相同时期的 java 堆内存使用情况,达到最大 16GB 然后又回到 8GB,这是可以理解的。我们的应用程序日志也同样支持。

但我的问题是,如果没有大量增加堆,那么总内存是如何逐渐增加的? (我指的是总内存而不是 tomcat,因为那是 zabbix 工具正在显示,除了 tomcat 在这台机器上运行之外什么都没有) 某处是否存在内存泄漏? 我在这里错过了什么?

【问题讨论】:

    标签: java tomcat memory memory-leaks


    【解决方案1】:

    如果不进一步检查您的系统,就很难说那里发生了什么。让我们从不同的角度来解决这个问题:

    如果您说您的应用程序在 8-16G 的 RAM 下运行良好,那么没有理由为其提供 64G 的最大内存。您允许 JVM 分配大量您不希望它使用的内存 - 但是,这样做是免费的。它很可能会运行很长时间而根本没有垃圾收集,然后长时间停止世界进行垃圾收集。在网络世界中,您宁愿更频繁但极快的 GC 运行 - 而不是不频繁且长时间运行。因此,Java 堆最大值的维度应该计算为 “应用程序需要的最小值加上针对突然更高需求的一些安全措施”,而不是 “服务器可以提供的最大值减去一些空间,以便其他(系统管理)应用程序可以偶尔运行”

    遵循这一原则,您最初的问题将不再是问题。

    回到您的问题:-Xmxdoes not denote 您的进程从操作系统中获得的最大内存。这只是应用程序可用的最大堆空间。向其添加各种其他内存(线程、PermGen 等)以获得 JVM 实际从操作系统分配的数量。

    【讨论】:

    • Olaf Kock,您关于限制堆内存的建议确实有道理。我也明白一个java进程占用的总内存总是超过分配的java堆。总内存=堆+烫发+jni+等。但是我们在这里看到的是总内存在一段时间内逐渐增加,但堆的增加非常有限/没有。我的问题是会有内存泄漏吗?
    猜你喜欢
    • 2017-04-03
    • 2019-06-04
    • 2020-10-09
    • 2017-04-09
    • 2011-11-27
    • 1970-01-01
    • 2019-11-11
    • 2014-10-24
    • 2021-12-08
    相关资源
    最近更新 更多