根據(jù)在memory中存活時(shí)間的長(zhǎng)短,Java所掌控的內(nèi)存被分為了young generation和old generation。如同字面意思崇渗,young generation意味著生存時(shí)間的短暫旋廷,基本上很快就被GC掉。而old generation則是可以存活很久的object狈网,會(huì)長(zhǎng)期在memory中存在宙搬。
考慮GC的優(yōu)化笨腥,主要是兩方面:
- 吞吐量(throughput):固定時(shí)間段內(nèi),不用再GC上的時(shí)間比例勇垛,也即是衡量GC耗費(fèi)時(shí)間的快慢脖母。
- 延遲(latency):
影響GC的因素:
- heap的大小
- young generation的比例
Heap的大小由“整個(gè)分配給應(yīng)用程序的內(nèi)存大小”(-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建峭。它是由參數(shù)-XX:NewRatio
控制的。例如-XX:NewRatio=3
表示young generation和old generation的比例為1:3决摧,也即是Eden和Survivor Space加起來只占heap memory的四分之一亿蒸。當(dāng)然,你還可以使用-XX:NewSize
和-XX:MaxNewSize
來直接控制young generation的范圍掌桩。
-XX:SurvivorRatio
可以用來調(diào)節(jié)Eden和Survivor的比例(雖然對(duì)performance的影響不大)边锁。例如-XX:SurvivorRatio=6
意味著Survivor和Eden的比例為1:6,同時(shí)意味著Survivor占整個(gè)young generation的八分之一(不是七分之一波岛,因?yàn)镾urvivor有兩塊)茅坛。