设置Java程序的最大内存是否会影响GC?

时间:2009-04-13 21:02:35

标签: java garbage-collection

在运行Java程序时添加-Xmx参数会导致垃圾收集器采取不同的行为还是更少发生?

5 个答案:

答案 0 :(得分:9)

是的,大多数Java垃圾收集器只在需要时运行,而不是按计划运行,无论是否需要。因此,通常情况下,更多的内存会导致频繁,更长的垃圾收集。

世代垃圾收集器具有settings to control the allocation of memory between the young and tenured generations.通过将这些设置为年轻一代使用较小比例的总内存,年轻一代的绝对大小可以保持与总堆大小增加相同。然后,您将看不到垃圾收集频率或持续时间的大量变化 - 但是对于缓存等应用程序,您将有更多空间用于长期存在的对象。

答案 1 :(得分:4)

一般的答案是垃圾往往收集的频率较低,但GC暂停时间往往会更长。

假设您的VM可用内存比工作集大小多;否则你可能会花很多时间在垃圾收集中。

GC特性会有很大差异,具体取决于您使用的收集器和Java的版本,以及除了更高的-Xmx之外是否指定了更高的-Xms。较早版本的Java(5之前)在VM初始化后没有调整年轻代空间的大小。因此,即使你指定了一个非常大的-Xmx值,年轻一代的规模仍然很小,所以你会看到频繁的年轻一代收藏。

当年轻一代收藏发生时,即使它们是短命的物体,也会有一些“年轻”的物体被提升到终身空间。这意味着终生代将慢慢填满死亡的年轻物体,需要定期完整的GC。终结于终身代的此类对象的数量与年轻GC的数量成比例(假设您的计划中的活动持续不断)。因此,年轻一代的优势在于年轻一代的GC将会减少,因此年轻一代的物品将被推广到终身一代。

除-Xmx(google for java gc)之外还有许多调整参数,您必须对它们进行试验,因为每个应用程序的最佳设置会有所不同。

答案 2 :(得分:2)

是的,但这取决于您使用的垃圾收集器。对于这类问题,GC tuning page是一个很好的资源。

答案 3 :(得分:1)

确实如此,因为当你拥有更多的内存时,那么在收集和压缩时,它有更多的内容需要扫描。这意味着当一个(完整的)GC启动时,这意味着它必须扫描更多内存,并且可能也会压缩更多内存。也许有更多背景,我们可以进一步帮助。显然有三个不同的部分被扫描,因此它不一定直接与1-1意义相关。

答案 4 :(得分:1)

只是间接地,并在运行一段时间后。 -Xmx设置允许堆增长到的MAXIMUM大小,并且不影响初始大小。因此,它不会在程序运行的早期影响gc时间或频率。如果堆在gc之后仍然(太接近)已满,则堆大小将增加,这是-Xmx将影响的。 -Xmx的更高设置将允许堆(最终)变得更大,从而更少地触发集合(并且这些集合将花费更长时间,正如其他人所描述的那样)。

但是,如果您的应用程序没有使用太多内存(因此堆在gc之后大部分是空的),堆将永远不会增长,并且-Mx设置将无关紧要。

您可以使用-Xms设置初始GC堆大小。这将对垃圾收集产生直接影响。