本文目錄一覽:
java的類載入後什麼時候會被釋放?
首先,”java的類在第一次需要創建類的實例(對象)時被載入”這個說的不對\x0d\x0a\x0d\x0ajava中類被使用就就會時就會被載入到內存(比如反射等)\x0d\x0a然後回答你的問題。\x0d\x0a\x0d\x0a首先要介紹下相關知識(基礎知識純屬拷貝):\x0d\x0a\x0d\x0a首先來了解一下jvm(java虛擬機)中的幾個比較重要的內存區域\x0d\x0a\x0d\x0a方法區:在java的虛擬機中有一塊專門用來存放已經載入的類信息、常量、靜態變數以及方法代碼的內存區域,叫做方法區。\x0d\x0a常量池:常量池是方法區的一部分,主要用來存放常量和類中的符號引用等信息。\x0d\x0a堆區:用於存放類的對象實例。\x0d\x0a棧區:也叫java虛擬機棧,是由一個一個的棧幀組成的後進先出的棧式結構,棧楨中存放方法運行時產生的局部變數、方法出口等信息。當調用一個方法時,虛擬機棧中就會創建一個棧幀存放這些數據,當方法調用完成時,棧幀消失,如果方法中調用了其他方法,則繼續在棧頂創建新的棧楨。\x0d\x0a 除了以上四個內存區域之外,jvm中的運行時內存區域還包括本地方法棧和程序計數器,這兩個區域與java類的生命周期關係不是很大,在這裡就不說了,感興趣可以自己百度一下。\x0d\x0a\x0d\x0a其實類在JVM裡面有以下幾個階段:\x0d\x0a\x0d\x0a載入 — 連接 — 初始化 — 使用 — 卸載 \x0d\x0a\x0d\x0a主要給你說明卸載:\x0d\x0a在類使用完之後可能會被卸載,可能性如下:\x0d\x0a如果有下面的情況,類就會被卸載:\x0d\x0a該類所有的實例都已經被回收,也就是java堆中不存在該類的任何實例。\x0d\x0a載入該類的ClassLoader已經被回收。\x0d\x0a該類對應的java.lang.Class對象沒有任何地方被引用,無法在任何地方通過反射訪問該類的方法。\x0d\x0a 如果以上三個條件全部滿足,jvm就會在方法區垃圾回收的時候對類進行卸載,類的卸載過程其實就是在方法區中清空類信息,java類的整個生命周期就結束了。
java程序什麼是類載入
你可以了解一下
深入理解java虛擬機,
java類載入
是因為在運行時當它需要引用某個類的時候,會先去載入這個類,就是去讀這個class文件到內存裡面來,現在還沒有創建這個類的實例,
你可以理解為
你寫的java代碼在編譯成class文件後,並沒有去執行,或者去引用他,只有程序運行時它將要使用這個類的時候才會去讀取這個class文件,這時候叫做類載入,當緩存了這個類文件之後,後面的創建類的時候都會去引用它,因為類載入是運行是載入,所以java代碼在運行時是有辦法修改的,同樣java類載入也允許載入一個遠程的class文件,也代表它是支持程序不停止時更新程序代碼的。
Java類載入機制?
1,類的載入
每個開發人員對java.lang.ClassNotFoundExcetpion這個異常肯定都不陌生,這背後就涉及到了java技術體系中的類載入。Java的類載入機制是技術體系中比較核心的部分,雖然和大部分開發人員直接打交道不多,但是對其背後的機理有一定理解有助於排查程序中出現的類載入失敗等技術問題,對理解java虛擬機的連接模型和java語言的動態性都有很大幫助。
那麼什麼是類的載入?
類的載入指的是將類的.class文件中的二進位數據讀入到內存中,將其放在運行時數據區的方法區內,然後在堆區創建一個java.lang.Class對象,用來封裝類在方法區內的數據結構。類的載入的最終產品是位於堆區中的Class對象,Class對象封裝了類在方法區內的數據結構,並且向Java程序員提供了訪問方法區內的數據結構的介面。
類載入器是Java語言的一個創新,也是Java語言流行的重要原因之一。它使得Java類可以被動態載入到Java虛擬機中並執行。類載入器從JDK1.0就出現了,最初是為了滿足JavaApplet的需要而開發出來的。JavaApplet需要從遠程下載Java類文件到瀏覽器中並執行。現在類載入器在Web容器和OSGi中得到了廣泛的使用,而類載入器並不需要等到某個類被「首次主動使用」時再載入它,JVM規範允許類載入器在預料某個類將要被使用時就預先載入它,如果在預先載入的過程中遇到了.class文件缺失或存在錯誤,類載入器必須在程序首次主動使用該類時才報告錯誤(LinkageError錯誤)如果這個類一直沒有被程序主動使用,那麼類載入器就不會報告錯誤。
2,類的生命周期
類載入的過程中包括有載入,驗證,準備,解析,初始化五個階段。而需要注意的是在這五個階段中,載入、驗證、準備和初始化這四個階段發生的順序是確定的,而解析階段則不一定,它在某些情況下可以在初始化階段之後開始,這是為了支持Java語言的運行時綁定(也成為動態綁定或晚期綁定)。另外注意這裡的幾個階段是按順序開始,而不是按順序進行或完成,因為這些階段通常都是互相交叉地混合進行的,通常在一個階段執行的過程中調用或激活另一個階段。
載入:查找並載入類的二進位數據
載入時類載入過程的第一個階段,在載入階段,虛擬機需要完成以下三件事情:
1、通過一個類的全限定名來獲取其定義的二進位位元組流。(並沒有指明要從一個Class文件中獲取,可以從其他渠道,譬如:網路、動態生成、資料庫等)
2、將這個位元組流所代表的靜態存儲結構轉化為方法區的運行時數據結構。
3、在Java堆中生成一個代表這個類的java.lang.Class對象,作為對方法區中這些數據的訪問入口。
相對於類載入的其他階段而言,載入階段(準確地說,是載入階段獲取類的二進位位元組流的動作)是可控性最強的階段,電腦培訓發現因為開發人員既可以使用系統提供的類載入器來完成載入,也可以自定義自己的類載入器來完成載入。
java類載入順序
記住 3 條原則:
1、父類優先於子類
2、屬性優先於代碼塊優先於構造方法
3、靜態優先於非靜態
因此,類載入順序為:
父類靜態變數-父類靜態語句塊-子類靜態變數-子類靜態語句塊-父類普通成員變數-父類動態語句塊-父類構造器-子類普通成員變數-子類動態語句塊-子類構造器
原創文章,作者:小藍,如若轉載,請註明出處:https://www.506064.com/zh-tw/n/301429.html