JVM 源碼分析之如何觸發並執行 GC 線程

前言

由於JVM中垃圾收集器的存在,使得Java程序員在開發過程中可以不用關心對象創建時的內存分配以及釋放過程,當內存不足時,JVM會自動開啓垃圾收集線程,進行垃圾對象的回收。對象的創建、使用,到最後的回收,整個過程就這樣悄無聲息的發生着,那麼這些垃圾回收線程到底是什麼時候觸發,並如何執行的呢?本文將對openjdk的源碼進行分析,瞭解一下相關的底層實現細節。

VMThread

VMThread負責調度執行虛擬機內部的VM線程操作,如GC操作等,在JVM實例創建時進行初始化

VMThread::create()方法負責該線程的創建,實現如下:

1、VMThread內部維護了一個VMOperationQueue類型的隊列,用於保存內部提交的VM線程操作VM_operation,在VMThread創建時會對該隊列進行初始化。

2、由於VMThread本身就是一個線程,啓動後通過執行loop方法進行輪詢操作,從隊列中按照優先級取出當前需要執行的VM_operation對象並執行,其中整個輪詢過程分爲兩步:

step 1

如果隊列爲空,_vm_queue->remove_next()方法則返回空的_cur_vm_operation,否則根據隊列中的VM_operation優先級進行重新排序,並返回隊列頭部的VM_operation。如果_cur_vm_operation爲空,則執行如下邏輯:

通過執行VMOperationQueue_lock->wait方法等待VM operation.

step 2

如果當前vm_operation需要在安全點執行,如FULL GC,則執行上述邏輯,否則執行以下邏輯

通過evaluate_operation執行當前的_cur_vm_operation,最終調用vm_operation對象的evaluate方法,實現如下:

子類通過重寫VM_Operation類的doit方法實現具體的邏輯。

如何觸發YGC

在《 JVM源碼分析之Java對象的內存分配 》(http://www.jianshu.com/p/e56c808b6c8a)一文中已經分析過,當新生代不足以分配對象所需的內存時,會觸發一次YGC,具體實現如下:

創建一個VM_GenCollectForAllocation類型的VM_Operation,通過執行VMThread::execute方法保存到VMThread的隊列中,其中execute的核心實現如下:

YGC的VM_Operation加入到隊列後,通過執行VMOperationQueue_lock的notify方法喚醒VMThread線程,等待被執行,其中VM_GenCollectForAllocation的doit方法實現如下:

本文不會對GC算法的具體實現進行分析。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章