[Java] 關於 Garbage Collection 的二三事(一)
今天我們要跟大家聊一點關於 Java 的神祕領域 – Garbage Collection (a.k.a. GC),亦即 “垃圾回收”,接觸過 Java 的人都知道,介紹 Java 物件的第一堂課,老師一定會跟你說「Java 跟 C 語言不一樣,它不需要自行解構,Java 語言會自動刪除不必要的物件」這時你一定會納悶,設計師沒有指定 delete/free 的時機 Java 又該如何知道何時該刪除…
相信這個疑問很快會被席捲而來的新盈資訊所覆蓋,小獅就是其中之一,忙著享受 GC 帶來的好處,卻忘了要了解它。在最近小獅重新翻閱多篇文件之後,得出了這篇筆記…
那~就讓我們開始吧!進入 GC 的世界!
JVM 與 GC
首先,讓我們先從 Java 與 GC 的關係開始說起,當你啟動一支 Java 程式之後,系統做的事情其實並不是直接把程式的內容放進記憶體裡去執行,而是呼叫一支稱為 Bootstrap Loader 的程式,開始一連串的動作。
既然用到 Bootstrap Loader 這個詞,相信敏感的人應該會馬上覺得熟悉,這個詞一般會出現在計算機(computer)相關的地方,指的是電腦在開機時,第一隻載入的程式… 意思就是 – Java 其實是執行在一台特殊的電腦上,這樣的一台虛擬出來的電腦,我們稱之為 Java Virtual Machine,Java 虛擬機,常被縮寫成 JVM。
Bootstrap Loader 這個詞一般會出現在計算機(computer)相關的地方,指的是電腦在開機時,第一隻載入的程式,多半是固定且無法更改的,只會到固定的地方讀取資料並 載入資料;以一般的個人電腦為例,就是指 BIOS,在電源開啟之後,CPU 的機制會啟動 BIOS,自 ROM 中讀入並開始執行,接著依照設定執行 POST(Power-on self test 即 開機自檢測),完成之後就到非揮發性儲存裝置 – 一般多為硬碟,讀取 MBR(Master boot record 即 主開機紀錄),並依指示載入作業系統(如:Windows、Linux 等)
說到 JVM,我們先前就已經知道,每一次執行 Java 程式,就會開啟一部新的 JVM;也就是說,每一支 Java 程式都是執行在獨立的 JVM 中,那這部擁有多執行緒處理能力,卻只被用來執行單一支程式的,虛擬機器中的作業系統到底長甚麼樣子,大家應該會很想知道吧!
JVM System Threads
先前我們說過 JVM 具有同時注1做很多件事的能力(多執行緒),那就讓我們來看看 JVM 除了程式之外還執行了些什麼:
注 1:”同時” 指的是抽象觀念上的同時,實際執行時仍可能會因為 CPU 核心數 與 工作排程策略 而造成些微的差距,但人類無法察覺。
注 2:底下的表格依據 Java 7 Hotspot VM 撰寫,其他的 JVM 可能與之有所出入。
VM thread
這個執行緒會不斷等待需要讓 JVM 進入 safe-point 的動作出現。它之所以被獨立成一個執行緒的原因是當 JVM 進入 safe-point 之後,所有的執行緒皆無法直接修改堆積區(heap area)的內容。這個執行緒的工作包含 “stop-the-world” garbage collections、thread stack dumps(執行緒堆疊傾印)、thread suspension、biased locking revocation。
This thread waits for operations to appear that require the JVM to reach a safe-point. The reason these operations have to happen on a separate thread is because they all require the JVM to be at a safe point where modifications to the heap can not occur. The type of operations performed by this thread are “stop-the-world” garbage collections, thread stack dumps, thread suspension and biased locking revocation.
Periodic task thread
這個執行續負責接收週期性執行動作的 timer 事件,或者該說 中斷。
This thread is responsible for timer events (i.e. interrupts) that are used to schedule execution of periodic operations
GC threads
這個執行緒可以支援 JVM 中多種不同的垃圾回收活動。
These threads support the different types of garbage collection activities that occur in the JVM
Compiler threads
這個執行緒會在執行程式時將 Bytecode 轉為原生指令(native code)。
These threads compile byte code to native code at runtime
Signal dispatcher thread
這個執行緒負責掌管 JVM 收到的訊息,並呼叫合適的 JVM 方法。
This thread receives signals sent to the JVM process and handle them inside the JVM by calling the appropriate JVM methods.
恩,好吧!我承認我還沒有辦法把它翻譯好,因為我對 JVM 的瞭解還不夠深。但是我要說的重點是,每一台 JVM 都配有一個 GC 執行緒,這代表 GC 的工作是在執行期間,因為某種條件觸發的。
若要了解觸發條件是什麼,我們就必須要先了解 Java 是如何管理物件的,既然無法手動釋放物件,那我們就可以大膽推測,Java 的物件生成和管理,是由 JVM 負責的,垃圾收集器(Garbage Collector)會自行尋找不必要的(垃圾)物件,並清除它。