本文目錄一覽:
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類加載機制?
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程序什麼是類加載
你可以了解一下
深入理解java虛擬機,
java類加載
是因為在運行時當它需要引用某個類的時候,會先去加載這個類,就是去讀這個class文件到內存裡面來,現在還沒有創建這個類的實例,
你可以理解為
你寫的java代碼在編譯成class文件後,並沒有去執行,或者去引用他,只有程序運行時它將要使用這個類的時候才會去讀取這個class文件,這時候叫做類加載,當緩存了這個類文件之後,後面的創建類的時候都會去引用它,因為類加載是運行是加載,所以java代碼在運行時是有辦法修改的,同樣java類加載也允許加載一個遠程的class文件,也代表它是支持程序不停止時更新程序代碼的。
原創文章,作者:HKXI,如若轉載,請註明出處:https://www.506064.com/zh-hant/n/135489.html