1.Java平臺(tái)
- Java平臺(tái)兩個(gè)最主要的特點(diǎn):1.一次書(shū)寫(xiě),到處運(yùn)行 2.垃圾回收
- 1.到處運(yùn)行:主要依靠JVM速缨,Java代碼被編譯成字節(jié)碼文件任斋,運(yùn)行在對(duì)應(yīng)不同硬件的JVM上苍狰,屏蔽了操作系統(tǒng)與硬件
- 2.垃圾回收:像C語(yǔ)言荤傲,程序員可以通過(guò)
malloc
自己申請(qǐng)內(nèi)存空間,但是用完必須要釋放颈渊,否則會(huì)造成內(nèi)存泄露遂黍。Java無(wú)需自己去管理不使用的內(nèi)存。
- Java的JVM俊嗽、JRE雾家、JDK
- JVM: Java虛擬機(jī),Java跨平臺(tái)的基礎(chǔ)
- JRE:Java程序運(yùn)行所需環(huán)境绍豁,包含JVM和Java類(lèi)庫(kù)
- JDK:Java開(kāi)發(fā)工具包芯咧,包含了JRE和其他編譯器、診斷工具竹揍。
2.Java是解釋執(zhí)行敬飒?
不準(zhǔn)確
- Java代碼首先被Javac編譯成字節(jié)碼,運(yùn)行時(shí)芬位,JVM內(nèi)嵌的解釋器將字節(jié)碼轉(zhuǎn)換為機(jī)器碼
- 但是常見(jiàn)的JVM无拗,也提供了JIT編譯器(動(dòng)態(tài)編譯器),能夠在運(yùn)行時(shí)將熱點(diǎn)代碼編譯成機(jī)器碼昧碉,此時(shí)就是編譯執(zhí)行而不是解釋執(zhí)行了
3.拓展
- 主流的Java版本中英染,如JDK8是解釋和編譯混合的模式。
- JVM有clinet模式和server模式
- client:1500次編譯
- server:上萬(wàn)次調(diào)用收集信息編譯
- Oracle Hotspot JVM提供兩種JIT
- C1:適用于啟動(dòng)速度敏感的應(yīng)用被饿,如普通桌面應(yīng)用--client
- C2:適用于長(zhǎng)時(shí)間運(yùn)行的服務(wù)器端設(shè)計(jì)--server
- JVM啟動(dòng)時(shí)四康,可以指定不同的參數(shù)對(duì)運(yùn)行模式進(jìn)行選擇
-
-Xint
:告訴JVM只解釋執(zhí)行,不對(duì)代碼進(jìn)行編譯狭握。拋棄了JIT帶來(lái)的性能優(yōu)勢(shì) -
-Xcomp
:關(guān)閉解釋器闪金,不要解釋執(zhí)行。 -
AOT
模式:直接將字節(jié)碼編譯成機(jī)器代碼论颅,避免了JIT預(yù)熱等方面的開(kāi)銷(xiāo)- 編譯:
jaotc --output libHelloWorld.so HelloWorld.class jaotc --output libjava.base.so --module java.base
- 啟動(dòng)
java -XX:AOTLibrary=./libHelloWorld.so,./libjava.base.so HelloWorld
-
- 不僅僅只有 Java 語(yǔ)言可以運(yùn)行在 JVM 上毕泌,本質(zhì)上合規(guī)的字節(jié)碼都可以運(yùn)行,Java 語(yǔ)言自身也為此提供了便利嗅辣,我們可以看到類(lèi)似 Clojure撼泛、Scala、Groovy澡谭、JRuby愿题、Jython 等大量 JVM 語(yǔ)言损俭。
參考:《java核心技術(shù)36講》