1、美團經典文章:
2、參考文章:
3、gc 概念:
4、cms gc日誌詳細介紹:
5、gc root的定義:
併發標記和重新標記兩個階段中間還增加了兩個階段: [cms-concurrent-preclean-start] 併發預清理階段和 [cms-concurrent-abortable-preclean-start] 併發可中斷預清理階段。這兩個階段都是為了減輕後續進行的重新標記階段的工作量。併發預清理階段主要處理在併發標記階段重新進入老年代的物件。併發可中斷預清理階段等待minor gc的執行。
重新標記階段由於跨代引用的存在,需要對整個堆進行掃瞄。但是重新標記階段是stw的,為了縮短重新標記階段的時間,需要儘量減少eden區的大小。有兩種方式:增加可中斷的併發預清理階段,預設最大等待5s,如果中間發生minor gc是理想的結果。通過可配置的引數保證remark前強制進行一次minor gc。
跨代引用在minor階段也是存在的,因此也要解決類似問題。minor是通過卡表實現的,因為老年代引用新生代物件的比例非常低,根據這一特性jvm引入了卡表(card table)來實現這一目的。卡表的具體策略是將老年代的空間分成大小為512b的若干張卡(card)。卡表本身是單位元組陣列,陣列中的每個元素對應著一張卡,當發生老年代引用新生代時,虛擬機器將該卡對應的卡表元素設定為適當的值。如上圖所示,卡表3被標記為臟(卡表還有另外的作用,標識併發標記階段哪些塊被修改過),之後minor gc時通過掃瞄卡表就可以很快的識別哪些卡中存在老年代指向新生代的引用。這樣虛擬機器通過空間換時間的方式,避免了全堆掃瞄。
哪些是gc root:
注意,是一組必須活躍的引用,不是物件
GC問題排查
一 使用jps檢視執行緒id 二 使用jstat gc 3331 250 20檢視gc情況,一般比較關注perm區的情況,檢視gc的增長情況。三 使用jstat gccause 額外輸出上次gc原因 四 使用jmap dump format b,file heapdump 3331生成堆轉儲檔案 五...
gc 等相關等待事件描述
gc current cr request 這些等待事件僅在 cr或者當前緩衝區的 gc請求正在進行時才相關 該請求完成之前,這些事件充當佔位符 gc current cr 2 3 way 請求當前塊或者 cr塊,然後在經過兩三個網路中繼段後收到這些塊 當塊不忙或者未堵塞時,會立即處理請求 gc c...
阻塞佇列的GC問題
最近使用佇列存放資料,發生了一次gc問題,這裡記錄一下。開始使用定長阻塞佇列,程式執行正常。blockingqueuequeue new arrayblockingqueue 2000 之後再阻塞佇列中存放collection物件,出現gc。blockingqueue queue new array...