Java -Xms 初始大小影响

设置 -Xms 参数,并且使初始内存更大,例如,然后是默认计算的内存(在我的情况下为 64 MB,根据 Java GC tunning:http://java.sun.com/javase/technologies/hotspot/gc/gc_tuning_6.html#par_gc.ergonomics.default_size)有什么好处?

另外,将初始和最大内存都设置为相同的大小有什么好处吗?

谢谢。


答案 1

这样做的好处是,当您用完足够的堆时,会降低性能,因此必须调整其大小。如果您最初将其设置为64MB,但事实证明您的应用程序在负载下需要250MB,那么当您达到接近64MB时,JVM将分配更多的堆空间,并可能移动一些对象并进行其他簿记。这当然需要时间。

当应用程序处于负载状态时,您希望所有资源都专用于使其运行,因此此额外工作可能会使应用程序的响应速度变慢,或者在某些情况下,如果在调整堆大小之前内存不足,它也会崩溃。

有时,在使用 Java 应用程序时,您会看到“设置为和相同的值”等说明。这样做是为了避免完全调整大小,以便您的应用程序启动时其堆已经与将来一样大。XmsXmx


答案 2

链接的文章解释得足够清楚:

默认值: -Xms 3670k -Xmx 64m [...]大型服务器应用程序经常遇到这些默认值的两个问题。一个是启动缓慢,因为初始堆很小,必须在许多主要集合上调整大小。一个更紧迫的问题是,对于大多数服务器应用程序来说,默认的最大堆大小非常小。服务器应用程序的经验法则是:

  1. 除非遇到暂停问题,否则请尝试向虚拟机授予尽可能多的内存。默认大小 (64MB) 通常太小。
  2. 将 -Xms 和 -Xmx 设置为相同的值,通过从虚拟机中删除最重要的大小调整决策来提高可预测性。但是,如果做出错误的选择,虚拟机将无法进行补偿。
  3. 通常,随着处理器数量的增加而增加内存,因为分配可以并行化。

您也可以对这个问题的讨论感兴趣。


推荐