我开始使用
-Xmx
选项来让我的进程使用更多的内存(256Mb,尽管我认为我目前使用的少于128Mb)。我也注意到了启动内存的-Xms
选项,默认值为2Mb。我应该将这个值设置为什么,为什么?
-Xmx
选项来让我的进程使用更多的内存(256Mb,尽管我认为我目前使用的少于128Mb)。我也注意到了启动内存的-Xms
选项,默认值为2Mb。我应该将这个值设置为什么,为什么?
-Xmx
参数定义了JVM堆的最大内存大小。您必须了解程序的性能并根据其负载情况设置此参数。如果将值设置过低,则可能会导致OutOfMemoryException
或者程序的堆内存接近最大堆大小时出现非常差的性能。如果您的程序在专用服务器上运行,可以将此参数设置得更高,因为它不会影响其他程序。
-Xms
参数设置了JVM的初始和最小堆内存大小。这意味着当您启动程序时,JVM会立即分配此数量的内存。如果您的程序从一开始就会消耗大量的堆内存,这将非常有用。这避免了JVM需要定期增加堆大小,因此您可以在那里获得一些性能提升。如果您不知道此参数是否会对您有所帮助,请不要使用它。-Xms
和最大的-Xmx
堆大小设置为相同的值。您可以将其设置为256或512Mb。堆大小应该“适合”您的应用程序,但要找到正确大小并不容易。如果太小,您会耗尽内存,如果太大,则会浪费内存,并有冒长时间GC暂停的风险。当出现问题时(而且它们总是会出问题),拥有更多的堆可以更好地调试,并使任何泄漏的表现时间更长。
理想情况下,我会将-Xms
设置为我认为我的应用程序需要运行的大小,将-Xmx
设置为比此值大但不要太大的值。始终开启详细的垃圾收集并绘制正在使用的堆以检查已设置的值。
当我绘制堆时,我会查看正在发生的收集次数和类型。不要有太多收集,这很重要。然而,也不要拥有一个堆如此巨大,以至于几乎没有收集,因为它们发生时(完整gc不可避免),它们会受到伤害。理想情况下,希望获得一组定期间隔良好,暂停时间非常短的gcs。
话虽如此,对于32位Windows,-Xms
应与-Xmx
相同。这是因为Java(不考虑jrockit)需要连续的内存,而Windows的内存映射是分散的,因此尽早获得和锁定堆会更加划算。