概念解释:
-Xms:
初始堆大小 默认物理内存的 1/64(小于1GB)
空余堆大小小于 40% 时,JVM就会增大堆直到 -Xmx 的最大限制
-Xmx:
-Xmx 最大堆大小 默认物理内存的 1/4(小于1GB)
空余堆大小大于 70% 时,JVM就会减少堆直到 -Xms 的最小限制
JVM垃圾回收的不足:
当堆内存使用情况变化时,并不是单纯的扩大和缩小堆内存就完事了。在此之前还会执行GC(垃圾回收)操作。
如果 -Xms 起初值设置的比较小,那么就会频繁触发GC操作。当GC操作无法释放更多内存时,才会进行内存的扩充。
我们都知道GC操作是需要耗时的,而且Full GC会引起“Stop the World”,也就是说会引起线程停止,不可避免就会引起性能问题。
相同值的好处:
面对上面的问题,为了避免在生产环境由于heap内存扩大或缩小导致应用停顿,降低延迟,
同时避免每次垃圾回收完成后JVM重新分配内存。所以,-Xmx和-Xms一般都是设置相等的。
当然,如果生产系统上线前有一段预热时间的话,也可以不设置相等。对于需要高吞吐量的应用来说,可以不在乎这种停顿,
比如一些后台的应用之类,那么内存可以适当调大一些。(停顿时间越长,吞吐量反而越大),需要根据具体情况权衡。
把两者设置为一致,是为了避免频繁扩容和GC释放堆内存造成的系统开销/压力
注意事项:
其实虽然设置为相同值有很多好处,但也会有一些不足。比如,如果两个值一样,会减少GC的操作,
也意味着只有当JVM即将使用完时才会进行回收,此前内存会不停的增长。