在什么情况下Java性能会随着内存的增加而降低?
作者:互联网
我们正在DEV环境中加载测试Java 1.6应用程序. JVM堆分配为2Gb,-Xms2048m -Xmx2048m.在负载测试下,应用程序运行流畅,从不使用超过1.25Gb的堆,垃圾收集完全正常.
在我们的UAT环境中,我们使用相同的参数运行负载测试,唯一的区别是JVM,它分配了4Gb,-Xms4096m -Xmx4096m,否则,硬件与DEV完全相同.但是在负载测试期间,性能非常糟糕,应用程序几乎吞噬了整个堆,并且垃圾收集运行猖獗.
我们一遍又一遍地进行这些测试,消除了可能影响性能的所有可能症状,但结果是一样的.在什么情况下会是这种情况?
解决方法:
罪魁祸首可能是垃圾收集,正常的“停止世界”式收集导致我们一些性能问题;服务器软件运行速度很慢,但服务器的负载也很低.最终我们发现有一个“停止世界” – 垃圾收集器线程阻止整个软件在某些情况下运行(操作产生大量垃圾).
转向并发垃圾收集缓解了启动参数-XX:UseParallelOldGC -XX:ParallelGCThreads = 8的问题.我们在测试和生产中使用“仅”2gb堆,但同样值得注意的是GC占用的时间越长堆(即使您的软件实际上从未使用过所有的堆).
您可能希望从此处阅读有关不同垃圾收集器 – 选项和调优的更多信息:Java SE 6 HotSpot[tm] Virtual Machine Garbage Collection Tuning.
此外,这个问题的答案可以提供一些帮助:Java very large heap sizes.
标签:java,performance-testing,java-ee 来源: https://codeday.me/bug/20190613/1232001.html