JVM从入门到精通(二):详解Class加载过程,双亲委派机制,编译执行与解释执行
復習:Class文件結構
Class Loading Linking Initializing:編譯 加載 初始化
這節課,我們講 class 是怎么從硬盤中加載到內存中,并且準備執行的。
輸出:
jdk.internal.loader.ClassLoaders$AppClassLoader@2437c6dc null jdk.internal.loader.ClassLoaders$PlatformClassLoader@1e643faf null“雙親”這個詞不是特別好。實際上是有一個從子到父的過程,也有一個從父到子的過程。
(我理解的這個過程類似于DNS域名解析)是類似于遞歸的調用。
ClassLoader的Load過程,就是模板方法的設計模式。
手動加載一個類
package com.mashibing.jvm.c2_classloader;public class T005_LoadClassByHand {public static void main(String[] args) throws ClassNotFoundException {Class clazz = T005_LoadClassByHand.class.getClassLoader().loadClass("com.mashibing.jvm.c2_classloader.T002_ClassLoaderLevel");System.out.println(clazz.getName());//利用類加載器加載資源,參考坦克圖片的加載//T005_LoadClassByHand.class.getClassLoader().getResourceAsStream("");} }
可以看一下LoadClass源碼:
關于編譯器
默認模式是混合模式,就是混合使用解釋器加熱點代碼編譯。什么叫熱點代碼編譯?
多次被調用的方法,多次被調用的循環進行編譯,怎么檢測呢?就是用一個計數器,每個方法上都有一個方法,計數器循環有循環計數器。結果在發現某個方法一秒鐘執行了超過某個10萬次。我要對他進行編譯,拿大腿想一想我該怎么辦?直接編譯成本地代碼,再用的話直接用本地的。不用解釋器執行了。
這時候會有人問,為什么不直接都編譯成本地代碼呢,執行效率更高,因為Java解釋器現在效率已經非常高了,在一些簡單的代碼上它不屬于便器。第二點,如果你有一段代碼執行文件,特別特別多各種各樣的類庫,有時候好幾十個class,這是正常的。你上來二話不說先給編譯器讓他編譯,編譯的過程會長的嚇人,所以現在默認的模式是混合模式,但是完全可以用參數來指定到底是什么模式。
這個東西是可以驗證的,有一個小程序,可以通過指定不同的參數,看一下編譯模式、解釋模式、混合模式的執行速度上的差異。
差不多編譯模式和混合模式都在4秒左右,解釋模式耗時比較長。
總結
以上是生活随笔為你收集整理的JVM从入门到精通(二):详解Class加载过程,双亲委派机制,编译执行与解释执行的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 多线程与高并发(三):JUC包下新的同步
- 下一篇: 多线程与高并发(四):LockSuppo