Java堆设置

时间:2012-08-29 02:26:11

标签: java jvm jvm-arguments

在阅读有关性能调整的一些注意事项时,我确实在设置内存大小时注意到了一些建议:

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

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

另外, 如果我对-Xmx和-Xms的值不同,为什么GC会经常被触发,而不是当我对-Xmx和-Xms的大小相同时。

要在我的第二个问题中添加更多内容,如果我从最小堆大小64M和最大512 M开始,我相信除非我的应用程序使用的内存达到512M,否则不会触发完整的GC。 < / p>

同样如果我以-Xmx和-Xms的512M开始,当我的应用程序内存使用达到此限制时,JVM仍会触发完整的GC。 那么为什么建议将max和min设置为相同的值?

3 个答案:

答案 0 :(得分:2)

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

指导并非100%完美。有几种应用允许竞技场的发展是合理的。

答案 1 :(得分:1)

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

如果使用较低的Xms值启动应用程序并打开GC日志记录(-verbose:gc -Xloggc:FILENAME),日志文件将显示堆和生成大小在应用程序运行时如何更改。

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

答案 2 :(得分:0)

让-Xms&lt; -Xmx是允许JVM不预先分配整个Xmx,以便与其他应用程序有差异(或许有一段时间)。 Gory详细信息:http://www.ibm.com/developerworks/library/j-memusage/