在阅读一些关于性能调优的注释时,我在设置内存大小时确实注意到了一个建议:
Java应用程序应该将初始和最大永久生成大小调整到相同的值,因为增长或缩小永久生成空间需要一个完整的GC。在设置堆大小(即-Xmx=-Xms )时,也给出了类似的建议。
我的问题是,,为什么我们有-Xms设置呢?
另外,如果-Xmx和-Xms的值不同,而-Xmx和-Xms.的大小相同时,为什么会经常触发GC?
为了进一步补充我的第二个问题,,如果我从最小堆大小64 M和最大512 M开始,我相信除非我的应用程序使用的内存达到512 m.,否则不会触发完整的GC。
同样,如果我从-Xmx和-Xms的512 M开始,当我的应用程序内存使用达到这个限制时,JVM仍然会触发完整的GC。,那么为什么建议将max和min同时设置为相同的值呢?
发布于 2012-08-29 02:51:20
设置标志是在VM具有分代增量集合之前设计的。在这种情况下,全部都是完整的集合。在更现代的收藏家中,完整的收藏品是罕见的。这很好,因为增量集合通常只有几毫秒,所以UI体验不会改变。完整的大竞技场集合可能需要几秒钟或更长时间。如文件所述,改变竞技场的规模是为了保证每次都会有一个完整的集合。
指导并不是100%完美的。有几种应用程序允许竞技场发展是合理的。
发布于 2012-09-05 15:52:19
-Xms=64m -Xmx=512m并不意味着“用64到512 MB之间的堆启动”。它指示JVM在启动时请求64 at的提交内存和512 at的保留内存。堆开始时为64 it,当堆被填满时,堆将扩展到为其保留的空间中。因此,对于64 to的Xms,在堆填充到64 to之前,您将看到一个完整的集合。
如果您以Xms的低值启动应用程序并打开GC日志记录(-verbose:gc -Xloggc:FILENAME),则日志文件将显示随着应用程序的运行堆和生成大小的变化。
较低的Xms可能会使较小的集合更频繁,因为新一代会更小(假设您使用的是成比例的生成大小,而不是显式的),因此填充速度会更快。
发布于 2014-11-06 14:26:35
使用-Xms < -Xmx的原因之一是允许JVM预先不预先分配整个Xmx,这样其他应用程序就可以获得这种差异(可能会有一段时间)。血淋淋的细节:http://www.ibm.com/developerworks/library/j-memusage/
https://stackoverflow.com/questions/12170100
复制相似问题