當new 一個對象時,該對象首先進入eden(伊甸園,人類初始的住處),在沒有GC觸發時該對象是不會移動的。每當通過一次GC,那麼該對象的年齡就會加1,還有那些不可達的對象就會被銷燬,eden也會被清空。此時對象應該被移動到存活區(s0/s1)中,仍是在年青代的範圍中。並在存活區中不斷爬升它的年齡,當它的年齡達必定值時,該對象就是被移動到老年代中(叫「晉升」),清空s0/s1的對象。
當轉到大對象,或eden/s0/s1的空間太小,對象就會被直接移動到老年代中。
-XX:MaxTenuringThresold //最大晉升年齡,默認15。
參數說明:當到了這個年齡的對象必定會被移動到老年代中,但未到這個年齡也有可能被移動到老年代中,由jvm自行判斷。
-XX:TargetSurvivorRatio50 //指當存活區(s0/s1)的使用率到達50%時,不管對象是否到地最大晉升 年齡都會被移動到老年代中
-XX:PretenureSizeThreshold1024 //指當對象的大小超過1M就會被直接送到老年代中,只在串行與 ParNew中有效,對於ParallelGC無效。默認0,不指定 java
TLAB區域(Thread Local Allocation Buffer 線程本地分配緩存)
這是爲了加速線程對象分配而生的。通常狀況下對象會分配在堆上,而堆是全局共享的。就會發生一時間可能有多個線程在堆上去申請空間,激烈的競爭致使分配效率降低。考慮到對象分配是java最經常使用的操做,所以jvm提供了TLAB來提交分配效率,而TLAB自己佔用了eden空間。 緩存
-XX:-UseTLAB //禁用TLAB,這樣會致使性能降低,默認開始。
-XX:-ResizeTLAB //禁用自動調整TLAB的大小,默認開啓
-XX:TLABSize //手工指定一個TLAB的大小,在禁用自動調整的前提下
-XX:+PrintTLAB //查看TLAB的使用狀況
-XX:TLABRefillWasteFraction64 //指當TLAB空間不足,且當請求分配的對象大小,小於1/64的TLAB 時建立一個新的TLAB,不然分配到堆中
jvm