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