通常我会设置-Xms512m
和-Xmx1g
,这样当JVM启动时,它会分配512MB,并根据需要逐渐增加堆大小到1GB。但是,在专用服务器实例中,我看到这些值都设置为同样的1g
。将它们都设置为相同的值有什么优势吗?
通常我会设置-Xms512m
和-Xmx1g
,这样当JVM启动时,它会分配512MB,并根据需要逐渐增加堆大小到1GB。但是,在专用服务器实例中,我看到这些值都设置为同样的1g
。将它们都设置为相同的值有什么优势吗?
来自Oracle Java SE 8文档:
https://docs.oracle.com/javase/8/docs/technotes/guides/vm/gctuning/sizing.html默认情况下,虚拟机会在每次回收时增加或缩小堆以尝试在特定范围内保持自由空间与活动对象的比例。这个目标范围通过参数
-XX:MinHeapFreeRatio=<minimum>
和-XX:MaxHeapFreeRatio=<maximum>
设置为百分比,并且总大小受到下限的限制 --Xms<min>
和上限为-Xmx<max>
。将-Xms
和-Xmx
设置为相同的值可通过从虚拟机中删除最重要的大小调整决策来提高可预测性。但是,如果您做出了错误的选择,虚拟机将无法进行补救。
如果-Xms和-Xmx的值相同,则JVM不必调整堆大小,这意味着JVM会减少工作量并为应用程序提供更多时间。但是,如果-Xms的选择值不当,则分配的某些内存永远不会被使用,因为堆永远不会缩小,如果-Xmx的选择值不当,则会出现OutOfMemoryError。
有一些优势。
通常情况下,我会将Xms设置为我有信心使用的值,并将其加倍以留出未来用例或未经测试的情况的余地。也就是说,我们不希望使用的大小,但它可能会使用。
简而言之,最大值是你宁愿让程序失败也不要再使用更多的点。