总(Tomcat)内存增加但堆不

时间:2016-01-26 07:20:39

标签: java tomcat memory memory-leaks

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

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

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

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

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

1 个答案:

答案 0 :(得分:0)

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

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

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

回到您的问题:-Xmx does not denote您的进程从操作系统声明的最大内存。它只是应用程序可用的最大堆空间。添加各种其他内存(线程,PermGen,其他)以获取JVM实际从操作系统分配的数量。