使用-xms和-xmx优化Java应用程序

时间:2013-03-11 12:11:10

标签: java performance

我正在进行性能测试。我见过很多关于设置-Xmx和-Xmx值的博客。我有点困惑,因为有些人说-Xms = -Xmx很好。我正在一个项目中,在生产服务器上有大约8-15K人在线,即它总是处于高负荷状态。什么应该是-Xms和-Xmx的优化设置?

1 个答案:

答案 0 :(得分:1)

可悲的是,这是Java中的一个重要主题,而且您在此处针对特定版本的代码进行的调整越多,那么在您下次发布时,您将不得不重新调整它的风险。由于其复杂性,一些咨询公司专门研究这种类型的东西,而且我们现在看到Zing的发布,它是一个商业JVM,旨在为我们管理这个(通过抛出备用CPU来解决GC管理问题)。但是,据说有一些设置几乎总是有帮助。

你的目标是避免“阻止这个世界”。 JVM中的事件,在JVM启动时会暂停所有线程的事件。将Xms和Xmx设置为相同的值有助于此处,因为使它们不同会告诉JVM从小堆开始,然后根据需要调整大小。不幸的是,这个调整大小是一个停止世界事件,导致堆和完整GC中的大对象副本。昂贵。

你的下一个目标应该是避免物品过早使用。 JVM在创建大量对象时非常有效,然后很快就会释放它们。当对象太大时会出现问题,它们会保持一段时间,或者它们比伊甸园空间(为新对象保留的堆区域)更适合它们。

一般来说,我喜欢增加给年轻一代的堆的数量,并尽可能减少总堆的大小。较小的堆在Java中更快,但您可能会耗尽内存。因此,我将大部分时间用于优化算法和清理代码。如果这不能提供我所需的性能,那么我会指示JVM将其GC活动写入日志文件(详情请参见Analyze GC logs for Sun Hotspots, JVM 6)。我的目标是观察有多少数据得到终身。

最后,您应该阅读不同的GC算法并选择JVM支持的算法,以获得最佳性能。一般来说,我会远离G1收集器,它表现不佳,并且在QCon上被讨论为一个失败的实验' GC实施者正在转向其他方法。