《深刻理解 java 虛擬機》學習 -- 內存分配

《深刻理解 java 虛擬機》學習 -- 內存分配

1. Minor GC 和 Full GC 區別

概念:
  • 新生代 GC(Minor GC):指發生在新生代的垃圾收集動做,由於 Java 對象大多都具 備朝生夕滅的特性,因此 Minor GC 很是頻繁,通常回收速度也比較快。
  • 老年代 GC (Major GC / Full GC):指發生在老年代的 GC,出現了 Major GC,常常 會伴隨至少一次的 Minor GC(但非絕對的,在 ParallelScavenge 收集器的收集策略裏 就有直接進行 Major GC 的策略選擇過程) 。MajorGC 的速度通常會比 Minor GC 慢 10 倍以上。
Minor GC 觸發機制:

當年輕代滿時就會觸發Minor GC,這裏的年輕代滿指的是 Eden 代滿,Survivor 滿不會引起 GC。java

Full GC 觸發機制:

年老代滿時會引起 Full GC,Full GC 將會同時回收年輕代、年老代,數組

永久代滿時也會引起 Full GC,會致使 Class、Method 元信息的卸載。學習


2. 內存分配策略

1. 對象優先在 Eden 分配

大多數狀況下,對象在新生代 Eden 區中分配。當 Eden 區沒有足夠的空間進行分配時,虛擬機將發起一次 Minor GC。spa

2. 大對象直接進入老年代
  • 大對象指的是須要大量連續內存空間的 Java 對象,如很長的字符串及數組。code

  • 常常出現大對象容易致使內存還有很多空間時就提早觸發垃圾收集以獲取足夠的連續空間來 」安置「 它們。對象

3. 長期存活的對象將進入老年代

爲了識別哪些對象應當放在新生代,哪些對象應放在老年代,虛擬機給每一個對象定義了一個對象年齡(Age)計數器。若是對象在 Eden 出生並通過第一次 Minor GC 後仍然存活,而且能被 Survivor 容納的話,將被移動到 Survivor 空間中,並將對象年齡設爲 1。對象在 Survivor 區中每熬過一次 Minor GC,年齡就增長 1 歲,當它的年齡增長到必定程度(默認爲 15 歲)時,就會被晉升到老年代。對象晉升到老年代的年齡閾值,能夠經過參數 -XX:MaxTenuringThreshold 來設置。內存

4. 動態對象年齡斷定

若是在 Survivor 空間中相同年齡全部對象大小的總和大於 Survivor 空間的一半,年齡大於或等於該年齡的對象就能夠直接進入老年代,無須等到 MaxTenuringThreshold 中要求的年齡。字符串

相關文章
相關標籤/搜索