#虛擬機類加載機制
---
**虛擬機把描述類的數據從Class文件加載到內存,并對數據進行校驗、轉換解析和初始化,最終形成可以被Java虛擬機直接使用的Java類型,這就是虛擬機的類加載機制。**
類從被加載到虛擬內存中開始,到卸載內存為止,它的整個生命周期包括了:加載(Loading)、驗證(Verification)、準備(Preparation)、解析(Resolution)、初始化(Initialization)、使用(Using)和卸載(Unloading)七個階段。其中,驗證,準備和解析三個部分統稱為連接(Linking)。
###類加載的過程
類加載的全過程,加載,驗證,準備,解析和初始化這五個階段。
---
####加載
在加載階段,虛擬機需要完成以下三件事情:
* 通過一個類的全限定名來獲取定義此類的二進制字節流
* 將這個字節流所代表的靜態存儲結構轉換為方法區的運行時數據結構
* 在Java堆中生成一個代表這個類的java.lang.Class對象,作為方法區這些數據的訪問入口
####驗證
這一階段的目的是為了確保Class文件的字節流中包含的信息符合當前虛擬機的要求,并且不會危害虛擬機自身的安全。不同的虛擬機對類驗證的實現可能有所不同,但大致上都會完成下面四個階段的檢驗過程:文件格式驗證、元數據驗證、字節碼驗證和符號引用驗證。
**文件格式驗證**
第一階段要驗證字節流是否符合Class文件格式的規范,并且能被當前版本的虛擬機處理。
**元數據驗證**
第二階段是對字節碼描述的信息進行語義分析,以保證其描述的信息符合Java語言規范的要求。
**字節碼驗證**
第三階段時整個驗證過程中最復雜的一個階段,主要工作是數據流和控制流的分析。在第二階段對元數據信息中的數據類型做完校驗后,這階段將對類的方法體進行校驗分析。這階段的任務是保證被校驗類的方法在運行時不會做出危害虛擬機安全的行為。
**符號引用驗證**
最后一個階段的校驗發生在虛擬機將符號引用直接轉化為直接引用的時候,這個轉化動作將在連接的第三個階段-解析階段產生。符號引用驗證可以看作是對類自身以外(常量池中的各種符號引用)的信息進行匹配性的校驗。
####準備
準備階段是正式為類變量分配內存并設置類變量初始值的階段,這些內存都將在方法區進行分配。
####解析
解析階段是虛擬機將常量池的符號引用轉換為直接引用的過程。解析動作主要針對類或接口、字段、類方法、接口方法四類符號引用進行。
* 類或接口的解析
* 字段解析
* 類方法解析
* 接口方法解析
####初始化
前面的類加載過程中,除了在加載階段用戶應用程序可以通過自定義類加載器參與之外,其余動作完全由Java虛擬機主導和控制。到了初始化階段,才真正開始執行類中定義的Java程序代碼(或者說是字節碼)。在準備階段,變量已經賦過一次系統要求的初始值,而在初始化階段,則是根據程序員通過程序制定的主觀計劃去初始化類變量和其他資源,或者說初始化階段是執行類構造器<clinit>()方法的過程。
###類加載器
---
####類與類加載器
虛擬機設計團隊把類加載階段中的"通過一個類的全限定名來獲取描述此類的二進制字節流"這個動作放到Java虛擬機外部去實現,以便讓程序自己決定如何去獲取所需的類。實現這個動作的代碼模塊被稱為"類加載器"。
####雙親委派模型
站在Java虛擬機的角度講,只存在兩種不同的類加載器:一種是啟動類加載器(Bootstrap ClassLoader),這個類加載器使用C++語言實現,是虛擬機自身的一部分;另外一種就是所有其他的類加載器,這些類加載器都由Java語言實現,獨立于虛擬機外部,并且全部繼承自抽象類java.lang.ClassLoader。從Java開發人員的角度來看,類加載器還可以分得更細致一些,絕大部分Java程序都會使用到以下三種系統提供的類加載器:
* 啟動類加載器
* 擴展類加載器
* 應用程序類加載器
- JavaSE(Java基礎)
- Java基礎知識
- Java中的內存泄漏
- String源碼分析
- Java集合結構
- ArrayList源碼剖析
- HashMap源碼剖析
- Hashtable簡介
- Vector源碼剖析
- LinkedHashMap簡介
- LinkedList簡介
- JVM(Java虛擬機)
- JVM基礎知識
- JVM類加載機制
- Java內存區域與內存溢出
- 垃圾回收算法
- Java并發(JavaConcurrent)
- Java并發基礎知識
- 生產者和消費者問題
- Thread和Runnable實現多線程的區別
- 線程中斷
- 守護線程與阻塞線程的情況
- Synchronized
- 多線程環境中安全使用集合API
- 實現內存可見的兩種方法比較:加鎖和volatile變量
- 死鎖
- 可重入內置鎖
- 使用wait/notify/notifyAll實現線程間通信
- NIO
- 數據結構(DataStructure)
- 數組
- 棧和隊列
- Algorithm(算法)
- 排序
- 選擇排序
- 冒泡排序
- 快速排序
- 歸并排序
- 查找
- 順序查找
- 折半查找
- Network(網絡)
- TCP/UDP
- HTTP
- Socket
- OperatingSystem(操作系統)
- Linux系統的IPC
- android中常用設計模式
- 面向對象六大原則
- 單例模式
- Builder模式
- 原型模式
- 簡單工廠
- 策略模式
- 責任鏈模式
- 觀察者模式
- 代理模式
- 適配器模式
- 外觀模式
- Android(安卓面試點)
- Android基礎知識
- Android內存泄漏總結
- Handler內存泄漏分析及解決
- Android性能優化
- ListView詳解
- RecyclerView和ListView的異同
- AsyncTask源碼分析
- 插件化技術
- 自定義控件
- ANR問題
- Art和Dalvik的區別
- Android關于OOM的解決方案
- Fragment
- SurfaceView
- Android幾種進程
- APP啟動過程
- 圖片三級緩存
- Bitmap的分析與使用
- 熱修復的原理
- AIDL
- Binder機制
- Zygote和System進程的啟動過程
- Android中的MVC,MVP和MVVM
- MVP
- Android開機過程
- EventBus用法詳解
- 查漏補缺
- Git操作