我们正在 DEV 环境中对 Java 1.6 应用程序进行负载测试。 JVM 堆分配为 2Gb,-Xms2048m -Xmx2048m。在负载测试下,应用程序运行流畅,从未使用超过 1.25Gb 的堆,并且垃圾收集完全正常。
在我们的UAT环境中,我们使用相同的参数运行负载测试,唯一的区别是JVM,它分配了4Gb,-Xms4096m -Xmx4096m,否则硬件与DEV完全相同。但在负载测试期间,性能非常糟糕,应用程序几乎耗尽了整个堆,并且垃圾收集猖獗。
我们一遍又一遍地运行这些测试,消除了所有可能影响性能的症状,但结果是相同的。什么情况下会出现这种情况?
生产环境和 UAT 环境中的应用程序有些不同。
从症状来看,(IMO)不太可能是硬件、操作系统性能调整或 JVM 版本差异。不用说,这不太可能是由于应用程序拥有更多内存所致。
(您的应用程序可能会做一些奇怪的事情,例如根据最大堆大小调整某些数据结构的大小并导致计算错误,这并非不可想象。但我认为您会意识到这种可能性,所以让我们暂时忽略它.)
大概是相关操作系统环境的差异;例如操作系统或某些应用程序的不同版本、网络的差异、区域设置的差异等等。但最重要的是,当您的应用程序在 UAT 上运行时,99% 确定存在内存泄漏,而正是内存泄漏导致了堆内存的消耗和 GC 的过载。
我的建议是将其视为存储泄漏问题,并使用标准工具/技术来追踪问题的原因。在此过程中,您很可能能够弄清楚为什么这种情况只发生在您的 UAT 上。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)