我明白,一个更大的堆意味着更长的 GC 暂停时间 https://stackoverflow.com/questions/1651225/how-to-choose-the-jvm-heap-size。我对此表示同意——我的代码正在分析一些数据,我关心的只是最大限度地减少垃圾收集所花费的时间,单次暂停的长度对我来说并不重要。
堆太大会损害性能吗?我的理解是,“年轻”对象很快就会被GC,但“旧”对象可能需要更长的时间,所以我担心大堆会将一些短寿命的对象推入较长寿命的空间。我分配了大量的字符串,这些字符串很快就会被丢弃(在单次运行过程中大约 60 GB),因此我不想增加花在这些字符串上的 GC 时间。
我正在一台具有 8 GB RAM 的机器上进行测试,因此我一直在运行我的代码-Xms4g -Xmx4g
,并且截至我上次分析运行时,我花费了大约 20% 的运行时间来进行垃圾收集。我发现将堆增加到 5 GB 有助于减少它。生产服务器将具有 32 GB RAM,以及更高的内存要求。
我可以安全地运行它吗-Xms31g -Xmx31g
,或者这最终会损害性能?
堆太大会损害性能吗?
当您超过 31 GB 时,您可能会丢失 CompressedOops,这可能意味着您必须跳到 48 GB 才能获得更多可用内存。如果可以的话,我尽量将内存控制在 31 GB 以下。
我的理解是,“年轻”对象很快就会被GC,但“旧”对象可能需要更长的时间,所以我担心大堆会将一些短寿命的对象推入较长寿命的空间。
因此,我倾向于拥有大量的年轻一代,例如高达 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/小时,因为这样您就可以运行一整天而无需进行少量收集。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)