为JVM启动内存分配

时间:2010-04-29 17:46:52

标签: java jvm jvm-arguments

我开始在-Xmx命令上使用java选项,以允许我的进程使用更多的内存(256Mb,但我认为我目前使用的内存少于128Mb)。我还注意到启动内存的-Xms选项,默认值为2Mb。我该怎么设置这个值以及为什么?


  

Reference: Java

4 个答案:

答案 0 :(得分:8)

-Xmx参数定义了堆可以为JVM达到的最大内存大小。您必须很好地了解您的程序并查看它在负载下的执行情况并相应地设置此参数。如果程序的堆内存达到最大堆大小,则较低的值可能导致OutOfMemoryException或非常差的性能。如果您的程序在专用服务器上运行,则可以将此参数设置得更高,因为它不会影响其他程序。

-Xms参数设置JVM的初始和最小堆内存大小。这意味着当您启动程序时,JVM将立即分配此数量的内存。如果您的程序从一开始就消耗大量堆内存,这将非常有用。这避免了JVM需要定期增加堆大小,因此您可以在那里获得一些性能。如果您不知道此参数是否对您有所帮助,请不要使用它。

使用Resin等服务器端Java应用程序将最小-Xms和最大-Xmx堆大小设置为相同的值是一种很好的做法。 您可以设置为256或512Mb。

答案 1 :(得分:7)

对于您的应用程序查找权限,堆大小应该是“正确的”,但这并不容易。如果它太小,你就会耗尽内存,如果你要浪费内存,就会冒着长时间GC暂停的风险。当出现问题(并且它们总是出错)时,您拥有的堆越多,您需要调试的堆越多,泄漏所需的时间就越长。

理想情况下,我会将-Xms设置为我认为应用程序需要运行的大小,将-Xmx设置为大于此值的值(但不要太大)。始终打开详细垃圾回收并绘制正在使用的堆图,以检查您设置的值。

当我绘制堆图时,我会查看发生的集合数和类型。重要的是不要有太多。然而,重要的是不要有如此巨大的堆,以至于很少,因为当它们发生时(并且完全的gc是不可避免的)它们会受到伤害。理想情况下,正在寻找具有非常低暂停时间的常规间隔良好的gcs。

对于32位Windows -Xms应该与-Xmx相同,这是因为Java(不考虑jrockit)需要连续的内存而且Windows的内存映射是碎片的因此它需要获得并锁定尽早下堆。

答案 2 :(得分:2)

Xmx是内存池的上限。 Xms是初始大小。这就是它的全部内容。每种方法的适当大小取决于应用程序的复杂程度。将初始大小设置为高于2mb的主要优点就是JVM花费更少的时间从OS请求更多内存。如果你设置了256mb的上限,那么大多数企业应用程序的初始大小为32mb-64mb并不合理。

更多信息:http://java.sun.com/j2se/1.5.0/docs/tooldocs/windows/java.html

答案 3 :(得分:1)

  

我应该将此值设置为什么以及为什么?

取决于你的课程应用。

如果您知道您的应用程序最初消耗,假设第一分钟为64 MB,则使用默认值(2mb),将使VM请求内存多次,直到达到此64mb。这些内存请求会减慢您的应用程序的速度,因为垃圾收集器可能会在VM请求更多内容之前尝试释放空间多次运行。

如果你已经知道你将用作启动64 mb,使用-Xms参数将允许你预先分配该内存。

如果你消耗128mb并且你有足够的可用内存,你可以使用java -Xms128m并且不用担心长时间请求更多内存。

但同样,这取决于您的应用程序的功能,内存如何使用,何时需要。等等。