您好,登錄后才能下訂單哦!
這篇文章將為大家詳細講解有關什么是JVM的類加載及內存區域,文章內容質量較高,因此小編分享給大家做個參考,希望大家閱讀完這篇文章后對相關知識有一定的了解。
加載,加載為按需加載,主線程需要用到一個類才開始加載一個類。
驗證,簡而言之就是校驗class內容是否符合指定規范
準備,為類變量分配內存空間,并初始默認值。
初始化,執行類的初始化代碼(靜態代碼塊,靜態賦值代碼),注:初始化會檢驗父類是否初始化,沒有則必須先初始化父類。
使用
卸載
啟動類加載器-Bootstrap ClassLoader,用于加載Java核心類庫-java安裝目錄下的lib目錄下的class。
擴展類加載器-Extension ClassLoader,用于加載java下的一些擴展類庫-java安裝目錄lib\ext下的class。
應用程序類加載器-Application ClassLoader,加載項目ClassPath下所的class。
自定義類加載器,自己定義的類加載器
意思就是即優先讓父ClassLoader去加載。原因是避免重復加載,保證應用的classPath下的Class對象在內存中的唯一性。
tomcat作為java編碼的web容器,本身也是在jvm中運行,怎么讓基于tomcat容器的各個web應用正常運行,使得各個web應用包含的應用的class不會亂套,必須破壞雙親委派機制,為每一個web應用的class都用不同的類加載器去加載。
tomcat的類加載器層次圖
其中:
common、catalina、shared負責加載tomcat自己的核心類庫,webApp加載web應用的class(隔離web應用引用的三方類庫),jsp加載器加載JSP(每個JSP文件都對應一個Jsp類加載器,jsp加載器支持熱加載,即Jsp只要修改,就重新加載一次覆蓋原來的jsp)。
通過tomcat的類加載機制,可以達成以下目標:
tomcat支持各個web引用中不同版本的三方類庫相互隔離。
同一個第三方類庫的相同版本在不同web應用可以共享。
tomcat自身依賴的類庫需要與應用依賴的類庫隔離 。
jsp需要支持修改后不用重啟tomcat即可生效 為了上面類加載隔離和類更新不用重啟,定制開發各種的類加載器。
實際中,可以從Web服務器、數據庫或緩存服務器獲取bytes數組,這就不是系統類加載器能做到的了。
可以從不同的路徑中獲取同一個類的不同class對象,可以實現隔離,一個復雜的程序,內部可能按模塊組織,不同模塊可能使用同一個類,但使用的是不同版本,如果使用同一個類加載器,它們是無法共存的,不同模塊使用不同的類加載器就可以實現隔離,Tomcat使用它隔離不同的Web應用,OSGI使用它隔離不同模塊。
可以實現熱部署。使用同一個ClassLoader,類只會被加載一次,加載后,即使class文件已經變了,再次加載,得到的也還是原來的Class對象,而使用自定義類加載器,則可以先創建一個新的ClassLoader,再用它加載Class,得到的Class對象就是新的,從而實現動態更新。
存放類的元數據信息,可以理解為反射獲取的Class對象的哪些信息。
記錄當前執行的class文件中字節碼指令的位置
與線程是一對一的關系,每個線程都會有自己的一個程序計數器
一個程序計數器對應一個線程、一個線程對應一個棧、一個棧由一個個棧幀組成,一個方法對應一個棧幀,棧幀包含局部變量表、操作數棧、動態鏈接、方法出口(相當于結束方法時需要跳轉的位置)。棧幀在調用方法的時候進棧,方法結束的時候出棧。
存放對象數據(上述棧中只存在對象的引用(即堆內存中對象的地址)或基本數據類型的值)
所有線程共享
當引用變量地址數據出棧時,堆中的內存釋放由JVM控制回收
執行native方法會有線程對應的本地方法棧。
NIO中ByteBuffer類方法:allocateDirect(int capacity)-堆外分配內存空間返回DirectBuffer,通過DirectBuffer的Api可以操作堆外內存。
關于什么是JVM的類加載及內存區域就分享到這里了,希望以上內容可以對大家有一定的幫助,可以學到更多知識。如果覺得文章不錯,可以把它分享出去讓更多的人看到。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。