【发布时间】:2014-10-01 06:56:21
【问题描述】:
我知道larger heap means longer GC pauses。我对此没意见——我的代码正在分析一些数据,我所关心的只是最大限度地减少垃圾收集所花费的时间,单次暂停的长度对我没有影响。
堆太大会影响性能吗?我的理解是“年轻”对象会很快被 GC,但“旧”对象可能需要更长的时间,所以我担心大堆会将一些寿命短的对象推入寿命更长的空间。我分配了很多很快被丢弃的字符串(在一次运行过程中大约 60 GB),所以我不想增加花费在这些上的 GC 时间。
我正在一台具有 8 GB RAM 的机器上进行测试,因此我一直在使用 -Xms4g -Xmx4g 运行我的代码,截至我上次分析运行时,我将大约 20% 的运行时间用于垃圾收集。我发现将堆增加到 5 GB 有助于减少它。生产服务器将具有 32 GB 的 RAM,以及更高的内存要求。
我可以使用-Xms31g -Xmx31g 安全地运行它,否则最终会影响性能吗?
【问题讨论】:
-
我建议运行基准测试。
-
您可以将
-Xm*标志置于的最高值是可用系统内存的一半,所以“否”... -
@Makoto 这是真的吗?我已经在我的机器上设置了
-Xm*5g(8 GB 内存)没有问题——你能提供一个来源吗? -
从什么时候开始限制可用系统内存的一半?我不记得有问题。然而,这个问题更多的是关于高级 GC 调优,它涉及的远不止
-Xms和-Xmx。
标签: java memory garbage-collection jvm