java - 总(Tomcat)内存增加但堆没有

标签 java tomcat memory memory-leaks

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

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

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

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

但我的问题是,在堆内存没有增加太多的情况下,总内存是如何逐渐增加的? (我指的是总内存而不是 tomcat,因为那是正在显示的 zabbix 工具,除了 tomcat 没有在这台机器上运行) 某处有内存泄漏吗? 我在这里缺少什么?

最佳答案

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

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

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

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

关于java - 总(Tomcat)内存增加但堆没有,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35008680/

相关文章:

Node.js 由于内存不足而被杀死

c++ - 如何使用 glibc 的字符串实现在堆栈上分配 std::string?

java - Spring boot 使用的默认值 - spring-boot-starter-parent

java - 遍历图像的每个像素

java - maven中如何继承其他库的依赖?

java - 是否可以重启 Netbean 的 Tomcat 捆绑版本?

java - ColdFusion/Java 奇怪的脚本

JavaBridge 不打开 php(无法连接到服务器)

tomcat - 外部化 Tomcat 配置

ios - 我需要使计时器失效/释放吗?