JVM从入门到精通(二):详解Class加载过程,双亲委派机制,编译执行与解释执行
復(fù)習(xí):Class文件結(jié)構(gòu)
Class Loading Linking Initializing:編譯 加載 初始化
這節(jié)課,我們講 class 是怎么從硬盤中加載到內(nèi)存中,并且準(zhǔn)備執(zhí)行的。
輸出:
jdk.internal.loader.ClassLoaders$AppClassLoader@2437c6dc null jdk.internal.loader.ClassLoaders$PlatformClassLoader@1e643faf null“雙親”這個(gè)詞不是特別好。實(shí)際上是有一個(gè)從子到父的過(guò)程,也有一個(gè)從父到子的過(guò)程。
(我理解的這個(gè)過(guò)程類似于DNS域名解析)是類似于遞歸的調(diào)用。
ClassLoader的Load過(guò)程,就是模板方法的設(shè)計(jì)模式。
手動(dòng)加載一個(gè)類
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源碼:
關(guān)于編譯器
默認(rèn)模式是混合模式,就是混合使用解釋器加熱點(diǎn)代碼編譯。什么叫熱點(diǎn)代碼編譯?
多次被調(diào)用的方法,多次被調(diào)用的循環(huán)進(jìn)行編譯,怎么檢測(cè)呢?就是用一個(gè)計(jì)數(shù)器,每個(gè)方法上都有一個(gè)方法,計(jì)數(shù)器循環(huán)有循環(huán)計(jì)數(shù)器。結(jié)果在發(fā)現(xiàn)某個(gè)方法一秒鐘執(zhí)行了超過(guò)某個(gè)10萬(wàn)次。我要對(duì)他進(jìn)行編譯,拿大腿想一想我該怎么辦?直接編譯成本地代碼,再用的話直接用本地的。不用解釋器執(zhí)行了。
這時(shí)候會(huì)有人問(wèn),為什么不直接都編譯成本地代碼呢,執(zhí)行效率更高,因?yàn)镴ava解釋器現(xiàn)在效率已經(jīng)非常高了,在一些簡(jiǎn)單的代碼上它不屬于便器。第二點(diǎn),如果你有一段代碼執(zhí)行文件,特別特別多各種各樣的類庫(kù),有時(shí)候好幾十個(gè)class,這是正常的。你上來(lái)二話不說(shuō)先給編譯器讓他編譯,編譯的過(guò)程會(huì)長(zhǎng)的嚇人,所以現(xiàn)在默認(rèn)的模式是混合模式,但是完全可以用參數(shù)來(lái)指定到底是什么模式。
這個(gè)東西是可以驗(yàn)證的,有一個(gè)小程序,可以通過(guò)指定不同的參數(shù),看一下編譯模式、解釋模式、混合模式的執(zhí)行速度上的差異。
差不多編譯模式和混合模式都在4秒左右,解釋模式耗時(shí)比較長(zhǎng)。
總結(jié)
以上是生活随笔為你收集整理的JVM从入门到精通(二):详解Class加载过程,双亲委派机制,编译执行与解释执行的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 多线程与高并发(三):JUC包下新的同步
- 下一篇: Redis实战(二):Redis 的 S