程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> JAVA編程 >> JAVA編程入門知識 >> java類型生命周期的詳細解析

java類型生命周期的詳細解析

編輯:JAVA編程入門知識

開始階段

裝載:把二進制形式的java類型讀入jvm中。
1)通過該類型的完全限定名,產生一個代表該類型的二進制數據流;
2)解析這個二進制數據流為方法區內的內部數據結構;
3)創建一個表示該類型的java.lang.Class類的實例;

連接:把已讀入的類型數據合並到虛擬機的運行時狀態中。
1)驗證:確保java類型數據格式正確並且適用於jvm使用;
2)准備:為該類型分配內存;
3)解析:把常量池中的符號引用轉換為直接引用;

初始化:每個類和接口在首次主動使用時初始化。為類變量賦予正確的初始值;
1)如果類存在直接超類,且直接超類沒有被初始化,先初始化直接超類;
2)如果類存在初始化方法,就執行此方法;

只有六種活動被認為是主動使用:
1)、創建類的新實例
2)、調用類中聲明的靜態方法
3)、操作類或者接口中聲明的非常量靜態字段
4)、調用Java API中特定的反射方法
5)、初始化一個類的子類
6)、指定一個類作為jvm啟動時的初始化類

使用階段(絕大部分時間)

實例化

實例化途徑
明確實例化一個類的四種途徑:
1)、new操作符;
2)、調用Class或者Java.lang.reflect.Constructor對象的newInstance()方法;
3)、調用任何現有對象的Clone()方法;
4)、通過java.io.ObjectInputStream類的getObject()方法反序列化;

隱含實例化的幾種途徑:
1)、保存命令行參數的String對象;
2)、和類裝載相關,jvm裝載的每一個類型,會暗中實例化一個Class對象來代表這個類型;
3)、和類裝載相關,當jvm裝載了在常量池中包含CONSTANT_String_info入口類的時候,會創建新的String對象的實例來表示這些常量字符串;
4)、通過執行包含字符串連接操作符的表達式產生對象;

實例化步驟
1)、在堆中為保存對象的實例變量分配內存;
2)、為實例變量初始化為默認的初始值;
3)、為實例變量賦正確的初始值,有三種技術完成賦值:
  a)、如果對象是clone() 創建的,jvm把原實例變量中的值拷貝到新對象中;
  b)、如果是通過ObjectInputStream類的readObject()調用反序列化的,jvm從輸入流中讀取的值來初始化實例變量;
  c)、jvm調用對象的實例化方法把對象的實例變量初始化為正確的初始值;

垃圾收集和對象終結
jvm實現必須具有某種自動堆存儲管理策略,大部分是使用垃圾收集器。如果類聲明了 void finalize()方法,垃圾收集器在釋放實例內存前會執行這個方法。

垃圾收集器自動調用的finalize()方法拋出的任何異常都將被忽略。

結束階段

從jvm中卸載類型
很多情況,jvm中類的生命周期和對象的生命周期很相似。jvm如何判斷動態裝載的類型是否仍然被程序使用,其判斷方式和判斷對象是否仍然被使用很相似。

如果程序不再引用某類型,那麼類型就是不可觸及的,就可以被卸載。

使用啟動類裝載器裝載的類型永遠都是可觸及的,所以永遠不會被卸載。只有使用用戶定義的類裝載器裝載的類型才會變成不可觸及,才會被卸載。

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved