JVM 学习二:类加载器子系统
生活随笔
收集整理的這篇文章主要介紹了
JVM 学习二:类加载器子系统
小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.
1 類加載器子系統(tǒng)的作用
- 類加載器子系統(tǒng)負責從文件系統(tǒng)或者網絡中加載 Class 文件,Class 文件在文件開關有特定的文件標識
- ClassLoader 只負責 Class 文件的加載,至于它是否可以運行,則由 Execution Engine(執(zhí)行引擎)決定
- 加載的類信息存放于一塊稱為方法區(qū)的內存空間。除了類的信息外,方法區(qū)中還會存放運行時常量池信息,可能還包括字符串字面量和數(shù)字常量(這部分常量信息是 Class 文件中常量池部分的內存映射)
2 類的加載過程
加載 --> 鏈接(驗證、準備、解析) --> 初始化
2.1 加載
2.2 鏈接
2.2.1 驗證(Verify)
- 目的在于確保 Class 文件的字節(jié)流中包含信息符合當前虛擬機要求,保證被加載類的正確性,不會危害虛擬機自身安全
- 主要包括四種驗證:文件格式驗證、元數(shù)據驗證、字節(jié)碼驗證、符號引用驗證
2.2.2 準備(Prepare)
- 為類變量(靜態(tài)變量)分配內存并且設置該類變量的默認初始值,即零值
- 這里不包含用 final 修飾的 static,轉為 final 在編譯的時候就會分配了,準備階段會顯式初始化
- 這里不會為實例變量分配初始化,類變量會分配在方法區(qū)中,而實例變量是會隨著對象一起分配到 Java 堆中
2.2.3 解析(Resolve)
- 將常量池內的符號引用轉換為直接引用的過程
- 事實上,解析操作往往會伴隨著 JVM 在執(zhí)行完初始化之后再執(zhí)行
- 符號引用就是一組符號來描述所引用的目標。符號引用 的字面量形式明確定義在《Java 虛擬機規(guī)范》的 Class 文件格式中,直接引用就是直接指向目標的指針,相對偏移量或一個間接定位到目標的句柄
- 解析動作主要針對類或接口、字段、類方法、接口方法、方法類型等。對應常量池中的 CONSTANT_Class_info、CONSTANT_Fieldref_info、CONSTANT_Methodref_info 等
2.3 初始化
- 初始化階段就是執(zhí)行類構造器方法 <clinit>() 的過程
- 此方法不需要定義,是 Java 編譯器自動收集類中的所有類變量的賦值動作和靜態(tài)代碼塊中的語句合并而來,如果沒有類變量和靜態(tài)代碼塊,是沒有 <clinit>() 方法的
- 構造器方法中指令按語句在源文件中出現(xiàn)的順序執(zhí)行,例如:
- <clinit>() 不同于類的構造器。(關聯(lián):構造器是虛擬機視角下的 <init>() )
- 若該類具有父類,JVM 會保證子類的 <clinit>() 已經執(zhí)行完畢
- 虛擬機必須保證一個類的 <clinit>() 方法在多線程下被同步加鎖
總結
以上是生活随笔為你收集整理的JVM 学习二:类加载器子系统的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 软件java技术论文_java技术论文
- 下一篇: java信息管理系统总结_java实现科