4.JVM類加載器:html
a.經過類名+包名+ClassLoader實例ID找到對應的二進制字節碼並加載JVM中java
b.連接:1.負責對二進制字節碼的格式進行校驗、初始化裝載類中的靜態變量以及解析類中調用接口、類。程序員
2.完成校驗以後,初始化類中的靜態變量並賦初值。算法
3.最後對類中的屬性、方法等進行驗證,以確保其須要的屬性、方法和對應的權限存在,可能緩存
報NoSuchMethodError、NoSuchFieldError等錯誤信息。安全
5.初始化:jvm
a.執行類中的靜態初始化代碼、構造器代碼以及靜態屬性的初始化。佈局
四種狀況下會執行:性能
a.調用了new b.反射調用了類中的方法優化
c.子類調用了初始化 d.JVM啓動過程當中的初始化類
6.JVM類加載順序:
a.兩種類加載器:啓動類裝載器(JVM實現的一部分)和用戶自定義類加載器(Java程序的一部分,必須是ClassLoader類的子類)
7.JVM裝載順序:
a.JVM啓動時,由BootStrap向User-Defined方向加載類;
應用進行ClassLoader時,由User-Defined向BootStrap方向查找並加載類。
1.Bootstrap ClassLoader(JVM的根ClassLoader),JVM啓動時初始化此ClassLoader,並由此ClassLoader完成jre/lib/rt.jar(sun JDK實現)
中全部class文件的加載。 注:rt.jar包含java規範定義的全部接口以及實現
2.Extension ClassLoader JVM用於加載擴展功能的一些jar包
3.System ClassLoader JVM用來加載啓動參數指定的Classpath中的jar包以及目錄,如AppClassLoader
4.User-Defined ClassLoader
繼承ClassLoader自定義ClassLoader類,用於加載非Classpath中的jar包以及目錄
8.JVM經常使用幾個方法:
a.loadClass: 加載指定名字的類,先從已加載的類中尋找,沒有則繼續從parent ClassLoader中尋找,仍沒找到則從System ClassLoader中尋找,
最後調用findClass方法查找; 如要改變類的加載順序,可覆蓋此方法實現。
b.findLoadedClass: 從ClassLoader實例對象的緩存中尋找已加載的類,調用native方法。
c.findClass: 直接拋出ClassNotFoundException,能夠經過覆蓋此方法和loadClass來加載相應的類。
d.findSystemClass 從System ClassLoader中尋找類,未找到,則繼續從BootStrap ClassLoader尋找,沒有就返回null.
e.defineClass 將二進制的字節碼轉換爲Class對象
f.resolveClass 負責完成Class對象的連接,如已連接過,則直接返回。
9.JVM執行引擎
a.invokestatic:調用類的static方法
b.invokevirtual:調用對象實例的方法
c.invokeinterface:將屬性定義爲接口來調用
d.invokespecial: 當JVM對於初始化對象(Java構造器的方法爲:<init>)以及調用對象實例中的私有方法時調用。
JVM主要的執行技術有:
1.解釋 第一代JVM
2.即時編譯 第二代JVM
3.自適應優化 如目前的HotspotJVM 開始對全部的代碼都採起解釋執行的方式,並監視代碼的執行狀況,
對那些常常調用的方法啓動一個後臺線程,將其編譯優化爲本地代碼;如該方法再也不頻繁使用,則
取消編譯過的代碼,仍對其解釋執行。
4.芯片級直接執行
10.JVM運行時數據區:
1.PC寄存區:存儲每一個線程下一步將執行的指令,如該方法被native修飾,則PC寄存器不存儲任何信息。
2.JVM棧 : JVM棧是線程私有的,每一個線程建立的同時都會建立JVM棧,JVM棧存放的爲當前線程的基本類型
變量(八種數據類型:boolean、char、byte、short、int、long、float、double)、部分返回的結果以及
Stack Frame; 非基本類型的對象在JVM棧上僅存放一個指向堆的地址。
http://www.open-open.com/lib/view/open1408453806147.html
11.多核並行:
1.java.util.concurrent.forkjoin包