我可以把堆太大了吗?

时间:2014-08-07 21:30:30

标签: java memory garbage-collection jvm

我理解larger heap means longer GC pauses。我没关系 - 我的代码正在对一些数据进行分析,而我所关心的只是最大限度地减少了垃圾收集所花费的时间,单次停顿的长度并没有对我产生影响。

可以使堆太大伤害性能吗?我的理解是"年轻"对象快速得到GC,但是#34;陈旧"对象可能需要更长时间,所以我担心的是,大型堆会将一些短期对象推入更长寿的空间。我做了很多快速丢弃的字符串分配(在一次运行过程中大约60 GB),所以我不想增加花在这些上的GC时间。

我在拥有8 GB内存的计算机上进行测试,因此我一直在使用-Xms4g -Xmx4g运行我的代码,而在我上次的异形运行中,我花了大约20%的时间运行时做垃圾收集。我发现将堆增加到5 gb有助于减少它。生产服务器将具有32 GB的RAM,并且内存要求更高。

我可以使用-Xms31g -Xmx31g安全地运行它,还是最终会损害性能?

1 个答案:

答案 0 :(得分:6)

  

可以使堆太大会损害性能吗?

当你超过31 GB时,你可能会丢失CompressedOops,这意味着你必须跳到48 GB才能获得更多可用内存。如果可以的话,我会尽量保持在31 GB以下。

  

我的理解是"年轻"对象快速得到GC,但是#34;陈旧"对象可能需要更长的时间,所以我担心大型堆会将一些短期对象推入更长寿的空间。

出于这个原因,我倾向于拥有大量的年轻一代,例如最高24 GB。

  

我可以使用-Xms31g -Xmx31g安全地运行它,还是最终会损害性能?

在32 GB的机器上,这将是非常糟糕的。当您包含JVM使用的关闭堆,操作系统,磁盘缓存时,您可能会发现超过24-28 GB的堆会损害性能。我会从24 GB开始,看看会怎么样,如果现在5 GB运行正常,你可能会发现你可以减少它的效果不大。

您可能会发现将数据从堆中移出将有助于GC时间。我已经运行了1 GB堆和800 GB堆的系统,但它取决于您的应用程序要求。

  

我花了大约20%的运行时间进行垃圾收集

我建议你降低分配率。使用内存分析器可以将分配率降低到300 MB / s以下,但小于30 MB / s会更好。对于极端系统,您可能需要不到1 GB /小时,因为这样您可以在没有次要集合的情况下全天运行。