在什么情况下Java性能会随着内存的增加而降低?

raf*_*ian 4 java performance-testing java-ee

我们正在DEV环境中加载测试Java 1.6应用程序.JVM堆分配为2Gb,-Xms2048m -Xmx2048m.在负载测试下,应用程序运行流畅,从不使用超过1.25Gb的堆,垃圾收集完全正常.

在我们的UAT环境中,我们使用相同的参数运行负载测试,唯一的区别是JVM,它分配了4Gb,-Xms4096m -Xmx4096m,否则,硬件与DEV完全相同.但是在负载测试期间,性能非常糟糕,应用程序几乎吞噬了整个堆,并且垃圾收集运行猖獗.

我们一遍又一遍地进行这些测试,消除了可能影响性能的所有可能症状,但结果是一样的.在什么情况下会是这种情况?

Ste*_*n C 5

您在Production和UAT环境中的应用程序有所不同.

从症状来看,(IMO)不太可能是硬件,操作系统性能调整或JVM版本的差异.不言而喻,这不太可能是由于应用程序具有更多内存.

(你的应用程序可能会做一些奇怪的事情并不是不可思议的......比如根据最大堆大小调整一些数据结构并使计算错误.但我认为你已经意识到这种可能性,所以现在让我们忽略它.)

这可能 OS环境的差异有关 ; 例如,OS的不同版本或某些应用程序,网络的差异,区域设置的差异等等.但最重要的是99%确定在UAT上运行时应用程序中存在内存泄漏,而内存泄漏正在扼杀堆内存并使GC过载.

我的建议是将此视为存储泄漏问题,并使用标准工具/技术来追踪问题的原因.在这个过程中,您很可能会弄清楚为什么这只会发生在你的UAT上.