许多参数会影响世代大小。下图说明了堆中已提交空间和虚拟空间之间的区别。在虚拟机初始化时,将保留堆的整个空间。可以使用该-Xmx选项指定保留空间的大小。如果-Xms参数的值小于参数的值,则-Xmx并非所有保留的空间都会立即提交给虚拟机。未分配的空间在此图中标记为“虚拟”。堆的不同部分(永久代,终身代和年轻代)可以根据需要增长到虚拟空间的极限。

默认情况下,虚拟机会增大或缩小每个集合中的堆,以尝试将每个集合中活动对象的可用空间比例保持在特定范围内。此目标范围由参数- XX:MinHeapFreeRatio=和设置为百分比,-XX:MaxHeapFreeRatio=总大小由限制为下限-Xms,之上为-Xmx。

参数默认值

MinHeapFreeRatio 40
MaxHeapFreeRatio 70
-Xms 3670k
-Xmx 64m

64位系统上堆大小参数的默认值已增加了大约30%。这种增加是为了补偿64位系统上更大的对象大小。

使用这些参数,如果某代中的可用空间百分比降到40%以下,则该代将被扩展以维持40%的可用空间,直到该代最大允许的大小。同样,如果可用空间超过70%,则将收缩该代,以使只有70%的空间是可用的,这取决于代的最小大小。

大型服务器应用程序在使用这些默认值时通常会遇到两个问题。一种是缓慢的启动,因为初始堆很小,并且必须在许多主要集合中调整其大小。更为紧迫的问题是,对于大多数服务器应用程序,默认的最大堆大小过小。服务器应用程序的经验法则是:

除非您在暂停方面遇到问题,否则请尝试为虚拟机分配尽可能多的内存。默认大小(64MB)通常太小。

将-Xms和-Xmx设置为相同的值可以通过从虚拟机中删除最重要的大小确定决策来提高可预测性。但是,如果选择不当,虚拟机将无法补偿。

通常,由于分配可以并行化,因此随着处理器数量的增加而增加内存。