以下是服务器上为tomcat设置的内存选项:-Xmx64g-Xms8g-XX:PermSize=768m-XX:MaxPermSize=768m
在过去的一个月里,操作系统(Linux)上的总内存从67GB增加到95GB,这是一个缓慢但渐进的增长。(我现在唯一的信息是zabbix(监控工具),显示服务器重启后的内存使用历史)
此服务器上运行的唯一(用户)应用程序是tomcat。
同样的zabbix工具还显示了8GB的java堆内存使用情况,达到最大16GB,然后回到8GB,这是可以理解的。我们的应用程序日志也支持相同的功能。
但是我的问题是,如果堆没有大幅增加,那么总内存是如何逐渐增加的呢?(我指的是总内存,而不是tomcat,因为这是zabbix工具显示的内存,而这台机器上只运行tomcat)是否存在内存泄漏?我错过了什么?
如果不进一步检查你的系统,很难说那里发生了什么。让我们从另一个角度来探讨这个问题:
如果您说您的应用程序使用8-16G的RAM运行良好,那么没有理由为其提供64G的最大内存。您允许JVM分配大量您不希望它使用的内存—但是,这样做是免费的。它可能会在没有垃圾收集的情况下运行很长一段时间,然后让世界长时间停止垃圾收集。在web世界中,您更希望GC运行更频繁但速度极快,而不是不频繁且长时间运行。因此,Java堆最大值的维度应计算为“应用程序需求的最小值加上一些安全措施,以应对突然增加的需求”,而不是“服务器可以提供的最大值减去一些空间,以便其他(系统管理)应用程序可以偶尔运行”
遵循这个原则,你最初的问题就不再是问题了。
回到你的问题:-Xmx
并不表示进程从操作系统中声明的最大内存。这只是应用程序可用的最大堆空间。向它添加各种其他内存(线程、PermGen等),以获得JVM实际从操作系统分配的内存量。