原文在这里:
这是一个众所周知的问题,从理论上将,应该很容易收缩,因为javagc的模型是,
内存可以在堆上移动,因此内存碎片没有问题。但是不幸的是,
JVM在默认情况下,很少收缩。一旦堆增长,很少收缩。
事实证明,Sun JVM可以控制盒改善收缩行为。
有一个参数""-XX:MaxHeapFreeRatio=",意味着
多少堆上空间是空闲的,超过此设定,就开始收缩;
另外一个参数"-XX:MinHeapFreeRatio=",意味着
堆上应该保留多少空闲空间,低于此设定,停止收缩。
缺省的设定是70%和40%,这意味着JVM收缩行为时空闲内存超过70%
而收缩后,还有40%的空闲空间。举个例子:
如果JVM的堆增长到300M的空间,当前只用到100M,那么不会执行收缩行为
(因为仅有66%是空闲的),而当只有90M被使用时,收缩行为
才会执行,但执行后,JVM仍然占用150M(因为需要保持40%的空闲空间)
应该注意的是,如果你要调整降低这个百分比,JVM的优秀GC是依赖于
大量的自由堆空间。为保持好的性能,不只是最小内存使用,你还可以
调整GC的其他参数。推荐一个参数组合:
- -XX:NewRatio=2 -XX:MinHeapFreeRatio=20 -XX:MaxHeapFreeRatio=30
但你的好处或许会有所不同。