Java中的類加載與類卸載方式
Java中的類加載與類卸載
類加載
Java中的代碼都寫在類里面,源代碼(.java文件)經(jīng)過編譯后會變成字節(jié)碼(.class文件),當(dāng)Java應(yīng)用程序運行時,JVM會加載要用到的類。
負(fù)責(zé)類加載的是java.lang.ClassLoader的對象,ClassLoader的對象會根據(jù)類的binary name(不知道怎么翻譯,二進(jìn)制名?)來讀取類的字節(jié)碼,然后把這些字節(jié)碼加載到JVM的方法區(qū)里,同時會在heap里面創(chuàng)建一個Class對象,這個Class對象是類的元數(shù)據(jù)和它的對象通信的接口。
類在heap中的Class對象和加載它的ClassLoader對象之間有強引用。
類卸載
不像類加載,Java中沒有提供顯式進(jìn)行類卸載的API,但是如果加載類的ClassLoader對象被垃圾回收器回收的話,這個類就會被卸載。
所以我們可以自己實現(xiàn)ClassLoader,自己加載類,然后對ClassLoader對象的引用賦值為null,等ClassLoader對象剩下的引用數(shù)量為0時會被回收,這樣就達(dá)到卸載類的目的了。
什么是類加載?什么時候卸載?
1.先看一下類的生命周期
加載 – 連接 – 初始化 – 使用 – 卸載
2.加載
類加載,指的是將類的.class文件中的二進(jìn)制數(shù)據(jù)讀入到內(nèi)存中,把它放進(jìn)運行時數(shù)據(jù)區(qū)的方法區(qū)內(nèi)(Perm區(qū))。
然后在堆區(qū)創(chuàng)建一個java.lang.Class對象,封裝這個類在自身的方法區(qū)內(nèi)的數(shù)據(jù)結(jié)構(gòu)。
類的加載的最終產(chǎn)品是位于堆區(qū)中的Class對象,Class對象封裝了類在方法區(qū)(Perm區(qū))內(nèi)的數(shù)據(jù)結(jié)構(gòu),并且向Java程序員提供了訪問方法區(qū)內(nèi)的數(shù)據(jù)結(jié)構(gòu)的接口。
注意,這是仍舊沒有生成針對該類的對象。后續(xù)對類的實例化,會使用堆內(nèi)存中的Class對象生成具體的實例對象。
3.卸載
如果有下面的情況,類就會被卸載:
1、該類所有的實例都已經(jīng)被回收,也就是java堆中不存在該類的任何實例。
2、加載該類的ClassLoader已經(jīng)被回收。
3、該類對應(yīng)的java.lang.Class對象沒有任何地方被引用,無法在任何地方通過反射訪問該類的方法。
如果以上三個條件全部滿足,jvm就會在方法區(qū)垃圾回收的時候?qū)︻愡M(jìn)行卸載,類的卸載過程其實就是在方法區(qū)中清空類信息,java類的整個生命周期就結(jié)束了。
總結(jié)
以上為個人經(jīng)驗,希望能給大家一個參考,也希望大家多多支持腳本之家。
相關(guān)文章
java EasyExcel面向Excel文檔讀寫邏輯示例詳解
這篇文章主要為大家介紹了java EasyExcel面向Excel文檔讀寫邏輯示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2022-07-07教你1秒將本地SpringBoot項目jar包部署到Linux環(huán)境(超詳細(xì)!)
spring Boot簡化了Spring應(yīng)用的開發(fā)過程,遵循約定優(yōu)先配置的原則提供了各類開箱即用(out-of-the-box)的框架配置,下面這篇文章主要給大家介紹了關(guān)于1秒將本地SpringBoot項目jar包部署到Linux環(huán)境的相關(guān)資料,超級詳細(xì),需要的朋友可以參考下2023-04-04springBoot 打war包 程序包com.sun.istack.internal不存在的問題及解決方案
這篇文章主要介紹了springBoot 打war包 程序包com.sun.istack.internal不存在的問題及解決方案,親測試過可以,需要的朋友可以參考下2018-07-07Google Kaptcha 框架實現(xiàn)登錄驗證碼功能(SSM 和 SpringBoot)
這篇文章主要介紹了Google Kaptcha 實現(xiàn)登錄驗證碼(SSM 和 SpringBoot)功能,本文通過實例代碼給大家介紹的非常詳細(xì),具有一定的參考借鑒價值,需要的朋友可以參考下2018-12-12