我在Linux Redhat上运行了很多JVM,它们具有32GB的物理内存和32GB的虚拟内存。这些JVM配置为Xmx的总值超过32GB,并且Linux可能使用其虚拟内存。 我的问题是,如果我指定Xmx超过所需的堆大小,它会延迟垃圾收集,结果分配更多的堆大于必要吗?因此它会导致操作系统从其虚拟内存中分配内存,从而导致性能下降。
答案 0 :(得分:2)
JVM在启动时保留最大堆大小(以及其他内存区域)。这意味着如果您的最大堆大小为32 GB,它将使用大约33-35 GB的虚拟内存,包括共享库线程等。
如果您将最大堆大小设置为32 GB,则必须使用64位引用,并且最终可用的内存少于最大堆量为24 GB的JVM,并且它将使用32-位参考。有些人估计,如果你将堆大小设置为32 Gb或更多,你必须将其增加到48 GB以获得更多可用内存。
鉴于您的计算机的大小,我建议您将堆限制为24 GB(或更少),并尽可能使用堆内存,因为这可以同时具有性能优势和更高的可伸缩性。
如果您的GC程序较低且想要避免收集,则可以每天或每周一次创建大量的伊甸园大小和GC。要做到这一点,你必须将你的垃圾丢弃到最低限度,你可以创建一个20 GB的伊甸园大小,在这种情况下你可以在一天内创造少于20 Gb,你可以避免触发任何GC(即使是次要的)并运行一个完整的GC作为过夜维护任务。例如早上2点。
如果您使用大型堆,则需要不惜一切代价避免使用交换。这是因为GC需要随机访问堆,并且只要一个触发器足够大就可以交换,你的机器就会捶打很长时间(可能是几小时),并可能锁定。您甚至可能需要重新启动才能让机器正常运行。 (很难杀死处于这种状态的过程/机器)