我从许多文献中读到,建议将-Xms和-Xmx设置为相同的值。但是没有给出任何原因。
在生产环境中,如果监视GC数据,您会注意到这是相对较短的时间段(通常少于一小时),JVM最终会将堆大小增加到-Xmx设置。每次JVM增加堆大小时,它都必须向操作系统请求额外的内存,这会花费一些时间(因此会增加GC命中时正在处理的所有请求的响应时间)。通常,JVM永远不会放过那种记忆。因此,由于JVM最终将获取-Xmx内存,因此您最好在开始时将其设置为该内存。
另一点是,使用较小的堆大小(以-Xms开头),GC将更频繁地发生。因此,从较大的堆开始,GC发生的频率就不会那么高。
最后,在生产环境中,通常每个操作系统(或每个VM)仅运行一个应用程序服务器。因此,由于应用程序服务器不会与其他应用程序竞争内存,因此您最好预先为其分配内存。
请注意,以上内容仅供生产。它也适用于系统测试环境,因为系统测试环境应尽可能模拟生产。
对于开发,使-Xms和-Xmx不同。通常,您在开发中的应用服务器不需要做很多工作,因此它通常会保留-Xms堆设置。此外,由于在开发过程中,应用服务器将与许多其他应用(邮件客户端,文字处理器,IDE,数据库,浏览器等)共享计算机,因此将-Xms设置为较小的大小可以使应用服务器与也在争夺相同资源的其他软件。