Java GC调优思路

根据在memory中存活时间的长短,Java所掌控的内存被分为了young generation和old generation。如同字面意思,young generation意味着生存时间的短暂,基本上很快就被GC掉。而old generation则是可以存活很久的object,会长期在memory中存在。

考虑GC的优化,主要是两方面:

  • 吞吐量(throughput):固定时间段内,不用再GC上的时间比例,也即是衡量GC耗费时间的快慢。
  • 延迟(latency):

影响GC的因素:

  • heap的大小
  • young generation的比例

Heap的大小由“整个分配给应用程序的内存大小”(-Xms-Xmx)和heap所占比例(-XX:MinHeapFreeRation=-XX:MaxHeapFreeRatio=)来决定。

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有两块)。

你可能感兴趣的:(Java GC调优思路)