在阅读一些关于性能调优的笔记时,我在设置内存大小时确实注意到了一条建议:
Java 应用程序应将初始和最大永久代大小设置为相同的值,因为增加或收缩永久代空间需要完整的 GC。设置堆大小时给出了类似的建议,即-Xmx=-Xms
。
我的问题是,那我们为什么要有 -Xms 设置呢?
此外, 为什么如果 -Xmx 和 -Xms 的值不同,而不是当我的 -Xmx 和 -Xms 的大小相同时,GC 会经常被触发。
要为我的第二个问题添加更多内容,如果我从最小堆大小 64M 和最大 512M 开始,我相信除非我的应用程序使用的内存达到 512M,否则不会触发完整 GC。
同样,如果我为 -Xmx 和 -Xms 从 512M 开始,当我的应用程序内存使用达到此限制时,JVM 仍然会触发完整的 GC。 那么为什么建议将 max 和 min 设置为相同的值呢?
最佳答案
设置标志是在 VM 具有分代增量收集之前设计的。在那种情况下,完整的 Collection 就在那里。在更现代的 Collection 家中,完整的 Collection 品很少见。这很好,因为增量收集通常只需几毫秒,因此 UI 体验不会改变。大型竞技场的完整 Collection 可能需要几秒钟或更长时间。更改竞技场大小 - 如文档所述 - 保证每次都会导致完整收集。
指导并非 100% 完美。允许竞技场增长是合理的,只有少数几种应用。
关于Java 堆设置,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12170100/