JVM系列之三:JVM之java類型生命週期詳解

前一篇文章詳細的描述了 java class 文件的格式  。它以標準的二進制形式來表現java 類型。現在我們再來看看當二進制的類型數據被導入到java虛擬機中的生命週期是什麼樣子的,下文所說的生命週期指的是 java 類型二進制的類型數據被導入到java虛擬機中的生命週期的。

生命週期可分爲 裝載、連接、初始化、對象實例化、垃圾收集、對象終結以及卸載 7個階段。接下來我們對這些階段一一解釋。

  1. 裝載
    裝載由三個基本動作完成:1、通過該類型的完全限定名,產生一個代表該類型的二進制數據流  2、解析這個二進制數據流爲方法區的內部數據結構  3、創建一個表示該類型的 java.lang.Class 類的實例。加載的詳細過程見 JVM系列之二:ClassLoad 詳解

  2. 連接
    連接階段可分爲三個子步驟:驗證、準備和解析。驗證 步驟確保了Java 類型數據格式正確並且適於Java 虛擬機使用。 準備步驟則負責爲該類型分配它所需的內存,設置默認的初始值。解析步驟則負責把常量池中的符號引用轉換爲直接引用。虛擬機的實現可推遲解析這一步,他可以在 當運行中的程序真正使用某個符號引用時再去解析(把常量池中的符號引用轉換爲直接引用)。

  3. 初始化
    當驗證、準備和(可選的)解析步驟都完成時,該類型就已經爲初始化做好了準備,在初始化期間,都將給類變量以適當的初始值。

  4. 對象實例化
    在java程序中,類可以被明確或者隱含的實例化。實例化一個類有四種途徑:1、明確的使用new 操作符 2、調用Class 或者 java.lang.reflect.Constructor 對象的 newInstance() 3、調用任何現有對象的 clone() 方法 4、通過 java.io.ObjectInputStream類的 getObject()方法反序列化

  5. 垃圾收集與對象終結
    一個終結方法是一個普通的java方法,他可以直接誒程序所調用。這樣的直接調用不會影響垃圾收集齊的自動調用過程。垃圾收集器(最多)只會調用一個對象的終結方法一次——在對象編程不再被引用的之後的某個時候,在佔據的對象被重用之前。如果終結方法代碼執行後,對象重新被引用了(復活了),隨後再次變得不被引用,垃圾收集齊不會第二次調用終結方法。
    垃圾收集器自動調用的 finalize()方法拋出的任何異常都將被忽略。垃圾收集齊可以用任意的順序調用 finalize() 方法,使用任意線程,升值並行使用多線程。

  6. 卸載
    JVM 裝載、連接並初始化類,使程序能使用類,當程序不再引用他們的時候可選的卸載他們。

 

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