根据在memory中存活时间的长短,Java所掌控的内存被分为了young generation和old generation。如同字面意思,young generation意味着生存时间的短暂,基本上很快就被GC掉。而old generation则是可以存活很久的object,会长期在memory中存在。
考虑GC的优化,主要是两方面:
- 吞吐量(throughput):固定时间段内,不用再GC上的时间比例,也即是衡量GC耗费时间的快慢。
- 延迟(latency):
影响GC的因素:
- heap的大小
- young generation的比例
Heap的大小由“整个分配给应用程序的内存大小”(-Xms<min>
和-Xmx<max>
)和heap所占比例(-XX:MinHeapFreeRation=<minimum>
和-XX:MaxHeapFreeRatio=<maximum>
)来决定。
Option | Default Value |
---|---|
-XX:MiniHeapFreeRatio |
40 |
-XX:MiniHeapFreeRatio |
70 |
-Xms |
6656K |
-Xmx |
calculated |
如果需要减少memory footprint,只需要限制heap size,比如将-XX:MiniHeapFreeRatio
降到10。
接下来是young generation的大小,也就是它占heap memory的比例。更多的young generation意味着更少的小范围GC,但由于减少了old generation,这意味着更频繁的大范围GC。它是由参数-XX:NewRatio
控制的。例如-XX:NewRatio=3
表示young generation和old generation的比例为1:3,也即是Eden和Survivor Space加起来只占heap memory的四分之一。当然,你还可以使用-XX:NewSize
和-XX:MaxNewSize
来直接控制young generation的范围。
-XX:SurvivorRatio
可以用来调节Eden和Survivor的比例(虽然对performance的影响不大)。例如-XX:SurvivorRatio=6
意味着Survivor和Eden的比例为1:6,同时意味着Survivor占整个young generation的八分之一(不是七分之一,因为Survivor有两块)。