Java堆设置

Java堆设置,java,jvm,jvm-arguments,Java,Jvm,Jvm Arguments,在阅读有关性能调整的一些说明时,我注意到设置内存大小时的一个建议: Java应用程序应该将初始和最大永久生成大小调整为相同的值,因为增长或收缩永久生成空间需要一个完整的GC。设置堆大小时给出了类似的建议,即-Xmx=-Xms 我的问题是,那么我们为什么要设置-Xms呢? 而且, 如果-Xmx和-Xms的值不同,而-Xmx和-Xms的大小相同,为什么GC会经常被触发。 为了补充我的第二个问题,如果我从最小堆大小64M和最大堆大小512M开始,我相信除非我的应用程序使用的内存达到512M,否则不会触

在阅读有关性能调整的一些说明时,我注意到设置内存大小时的一个建议:

Java应用程序应该将初始和最大永久生成大小调整为相同的值,因为增长或收缩永久生成空间需要一个完整的GC。设置堆大小时给出了类似的建议,即
-Xmx=-Xms

我的问题是,那么我们为什么要设置-Xms呢?

而且, 如果-Xmx和-Xms的值不同,而-Xmx和-Xms的大小相同,为什么GC会经常被触发。

为了补充我的第二个问题,如果我从最小堆大小64M和最大堆大小512M开始,我相信除非我的应用程序使用的内存达到512M,否则不会触发完整GC。


类似地,如果我从-Xmx和-Xms的512M开始,当我的应用程序内存使用达到这个限制时,JVM仍然会触发完全GC那么为什么建议将max和min设置为相同的值?

设置标志是在VM进行分代增量收集之前设计的。在这种情况下,完整的集合是所有的。在更现代的收藏家中,完整的收藏品是罕见的。这很好,因为增量收集通常只有几毫秒,因此UI体验不会改变。大型竞技场的完整集合可能需要几秒钟或更长时间。正如文件所说,改变竞技场的大小可以保证每次都有一个完整的集合


指导并非100%完美。允许竞技场增长是合理的应用很少。

-Xms=64m-Xmx=512m并不意味着“使用64到512 MB的堆启动”。它指示JVM在启动时请求64MB的提交内存和512MB的保留内存。堆开始时将是64MB,当堆满时,将扩展到为其保留的空间中。因此,对于64MB的Xms,在堆填充到64MB之前,您将看到一个完整的集合

如果以较低的Xms值启动应用程序并打开GC日志(
-verbose:GC-Xloggc:FILENAME
),日志文件将显示堆和生成大小在应用程序运行时的变化


较小的收集可能会更频繁地使用较低的Xms,因为新一代会更小(假设您使用的是按比例的生成大小而不是显式的),因此填充速度更快。

使用-Xms<-Xmx的一个原因是允许JVM不预先分配整个Xmx,以便差异可用(可能会有一段时间)到其他应用程序。这里的血淋淋的详细信息:

那么,即使我们的最小值和最大值大小相同或不同,也只有在内存利用率达到最大值时才会触发完整GC。这取决于收集器的实现。更准确地说,竞技场将被扩展当分配请求无法满足时(因此将发生完全收集)。这并不一定意味着竞技场中的所有内存都被您的程序使用。碎片化(在各代收集器中以各种方式发生)即使在空闲时也会使内存无法使用。事实上,即使在低限和高限相同的情况下,也会由于碎片而发生完整的收集。现代复制收集器降低了这种可能性,但它们通常不是零。谢谢。我确实注意到,即使在利用率达到最大值之前,也会触发小收集或大收集,所以请我希望我能接受两个答案。但是是的,你说的都是corerct,我在我的玻璃鱼上验证了它们。