java生命週期

1.加載
咱們編寫一個java的源文件,通過編譯後生成一個後綴名爲.class的文件,這結合四字節碼文件,
java虛擬機就識別這種文件,java的生命週期就是class文件從加載到消亡的過程。
關於加載,其實,就是將源文件的class文件找到類的信息將其加載到方法區中,
而後在堆區中實例化一個java.lang.Class對象,做爲方法區中這個類的信息的入口。
可是這一功能是在JVM以外實現的,主要的緣由是方便讓應用程序本身決定如何獲取這個類,
在不一樣的虛擬機實現的方式不必定相同,hotspot虛擬機是採用須要時在加載的方式,
也有其餘是先預先加載的。
2.鏈接
通常會跟加載階段和初始化階段交叉進行,過程由三部分組成:驗證、準備和解析三步
1)驗證:肯定該類是否符合java語言的規範,有沒有屬性和行爲的重複,繼承是否合理,總之,就是保證jvm可以執行
2)準備:主要作的就是爲由static修飾的成員變量分配內存,並設置默認的初始值
默認初始值以下:java

1.八種基本數據類型默認的初始值是0
2.引用類型默認的初始值是null
3.static final修飾的會直接賦值,例如:static final int x=10;則默認就是10.
3)解析:這一階段的任務就是把常量池中的符號引用轉換爲直接引用,說白了就是jvm會將全部的類或接口名、字段名、方法名轉換爲具體的內存地址。
3.初始化
這個階段就是將靜態變量(類變量)賦值的過程,即只有static修飾的才能被初始化,執行的順序就是:jvm

父類靜態域或着靜態代碼塊,而後是子類靜態域或者子類靜態代碼塊
4.使用
在類的使用過程當中依然存在三步:對象實例化、垃圾收集、對象終結函數

1)對象實例化:就是執行類中構造函數的內容,若是該類存在父類JVM會經過顯示或者隱示的方式先執行父類的構造函數,在堆內存中爲父類的實例變量開闢空間,並賦予默認的初始值,而後在根據構造函數的代碼內容將真正的值賦予實例變量自己,而後,引用變量獲取對象的首地址,經過操做對象來調用實例變量和方法
2)垃圾收集:當對象再也不被引用的時候,就會被虛擬機標上特別的垃圾記號,在堆中等待GC回收
3)對象的終結:對象被GC回收後,對象就再也不存在,對象的生命也就走到了盡頭
5.類卸載
即類的生命週期走到了最後一步,程序中再也不有該類的引用,該類也就會被JVM執行垃圾回收,今後生命結束spa

相關文章
相關標籤/搜索