Java之源文件的執(zhí)行全過(guò)程
1.JVM
1.定義:Java虛擬機(jī)
2.作用:運(yùn)行Java字節(jié)碼文件
3.實(shí)現(xiàn)方式:針對(duì)不同的操作系統(tǒng)(Windows、MacOS、Linux)存在不同的實(shí)現(xiàn)方式。目的是運(yùn)行相同的Java字節(jié)碼文件,在不同系統(tǒng)中給出相同的結(jié)果
4.自定義JVM:只要滿足JVM規(guī)范,就可以自定義自己的JVM
2.字節(jié)碼
1.定義:字節(jié)碼就是JVM能夠處理的代碼,是面向虛擬機(jī)的
2.優(yōu)點(diǎn):由于字節(jié)碼是面向虛擬機(jī)的,因此在不同操作系統(tǒng)可以無(wú)需重新編譯;并且執(zhí)行效率高
3.Java源文件執(zhí)行的過(guò)程
過(guò)程:Java源文件--->javac編譯--->.class文件(字節(jié)碼文件)--->解釋運(yùn)行--->機(jī)器碼
重點(diǎn):字節(jié)碼文件到機(jī)器碼這一過(guò)程中,Java的類的加載器需要先將字節(jié)碼文件加載到內(nèi)存中,然后解釋器開始逐行解釋執(zhí)行,這樣做效率低。
引入JIT(just in Time Compilation)運(yùn)行時(shí)編譯器,能夠在編譯后將字節(jié)碼文件對(duì)應(yīng)的機(jī)器碼保存下來(lái),機(jī)器碼的運(yùn)行效率是比較高的。
4.JIT(Just In Time Compilation)
1.定義:運(yùn)行時(shí)編譯器;在對(duì)字節(jié)碼文件解釋運(yùn)行時(shí)邊運(yùn)行邊編譯,并將編譯后字節(jié)碼文件對(duì)應(yīng)的機(jī)器碼保存下來(lái),從而提高程序運(yùn)行效率
2.優(yōu)點(diǎn):根據(jù)內(nèi)存中實(shí)際情況調(diào)整代碼;根據(jù)運(yùn)行情況生成最優(yōu)機(jī)器指令序列
缺點(diǎn):需要占用運(yùn)行時(shí)資源,導(dǎo)致程序卡頓;編譯準(zhǔn)備和識(shí)別時(shí)會(huì)占用時(shí)間,使得初始編譯不能達(dá)到最高性能
5.AOT(Ahead Of Time Compilation)
1.定義:提前編譯器;對(duì)字節(jié)碼文件在執(zhí)行前就編譯為機(jī)器碼;可以減少JIT初始編譯時(shí)無(wú)法達(dá)到最高性能的問(wèn)題
2.優(yōu)點(diǎn):在程序編譯前編譯,避免在運(yùn)行中占用系統(tǒng)資源;在程序運(yùn)行初期就達(dá)到最高性能
缺點(diǎn):提前編譯會(huì)占用更多外存;犧牲了Java的動(dòng)態(tài)性
6.AOT破壞Java動(dòng)態(tài)性
Java中的反射機(jī)制是動(dòng)態(tài)獲取運(yùn)行時(shí)類的對(duì)象及調(diào)用運(yùn)行時(shí)類的方法,此時(shí)只能采用JIT進(jìn)行編譯;
若采用AOT,則全部已經(jīng)提前編譯,無(wú)法動(dòng)態(tài)的修改運(yùn)行時(shí)類的屬性
7.編譯型語(yǔ)言與解釋型語(yǔ)言
編譯型:通過(guò)編譯器將源代碼一次性翻譯為可以被平臺(tái)執(zhí)行的機(jī)器碼
- 優(yōu)點(diǎn):執(zhí)行速度快
- 缺點(diǎn):開發(fā)效率低
- 實(shí)例:C、C++、Go
解釋型:通過(guò)解釋器將代碼逐行解釋為機(jī)器碼后,被平臺(tái)執(zhí)行
- 優(yōu)點(diǎn):開發(fā)效率高
- 缺點(diǎn):執(zhí)行速度慢
- 實(shí)例:Python、JavaScript
8.Java-編譯與解釋并存的語(yǔ)言
為改善編譯語(yǔ)言的效率,將編譯和運(yùn)行相結(jié)合,使得具有編譯語(yǔ)言和解釋語(yǔ)言二者的優(yōu)點(diǎn)。
在Java中,先將程序源代碼編譯為字節(jié)碼文件;在執(zhí)行時(shí),再將字節(jié)碼文件解釋為機(jī)器碼
9.Java和C++的相同點(diǎn)與不同點(diǎn)
相同點(diǎn):都是面向?qū)ο蟮恼Z(yǔ)言;都支持封裝、繼承、多態(tài)
不同點(diǎn):
- Java不提供指針直接訪問(wèn)內(nèi)存,程序更安全
- Java類是單繼承,C++的類支持多繼承
- Java存在GC垃圾自動(dòng)回收,無(wú)法手動(dòng)釋放無(wú)用內(nèi)存
- C++支持方法重載和操作符重載,Java只支持方法重載
10.Oracle JDK 和 Open JDK
Sun公司2006將Java開源,因此有了Open JDK
Oracle公司2009年收購(gòu)了Sun公司,在Open JDK基礎(chǔ)上整理出Oracle JDK,Oracle JDK不開源
二者區(qū)別:
- 是否開源:Oracle JDK是不完全開源的,Open JDK是開源的
- 是否免費(fèi):Oracle JDK僅僅3年免費(fèi),Open JDK免費(fèi)
- 功能性:Oracle JDK相比于Open JDK添加了特有的功能和工具
總結(jié)
以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。
相關(guān)文章
MybatisPlus實(shí)現(xiàn)數(shù)據(jù)攔截的使用示例
在MyBatis-Plus中,可以通過(guò)自定義攔截器來(lái)實(shí)現(xiàn)對(duì)SQL語(yǔ)句的攔截和修改,本文就來(lái)介紹一下如何使用,具有一定的參考價(jià)值,感興趣的可以了解一下2023-10-10IntelliJ IDEA中如何調(diào)試Java Stream操作
這篇文章主要介紹了IntelliJ IDEA中如何優(yōu)雅的調(diào)試Java Stream操作,在強(qiáng)大的IDEA插件支持下,stream的調(diào)試其實(shí)也沒(méi)那么難了,下面就來(lái)學(xué)習(xí)一下在IDEA中如何調(diào)試stream操作吧2022-05-05解決啟用 Spring-Cloud-OpenFeign 配置可刷新項(xiàng)目無(wú)法啟動(dòng)的問(wèn)題
這篇文章主要介紹了解決啟用 Spring-Cloud-OpenFeign 配置可刷新項(xiàng)目無(wú)法啟動(dòng)的問(wèn)題,本文重點(diǎn)給大家介紹Spring-Cloud-OpenFeign的原理及問(wèn)題解決方法,需要的朋友可以參考下2021-10-10java使用Filter實(shí)現(xiàn)自動(dòng)登錄的方法
這篇文章主要為大家詳細(xì)介紹了java使用Filter實(shí)現(xiàn)自動(dòng)登錄的方法,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2017-04-04java開發(fā)中的誤區(qū)和細(xì)節(jié)整理
這篇文章給大家整理了關(guān)于JAVA開發(fā)中的細(xì)節(jié)以及經(jīng)常進(jìn)入的誤區(qū)整理,希望我們整理的內(nèi)容能夠給大家提供到幫助。2018-04-04Java報(bào)錯(cuò):ClassCastException問(wèn)題解決方法
異常是程序中的一些錯(cuò)誤,但并不是所有的錯(cuò)誤都是異常,并且錯(cuò)誤有時(shí)候是可以避免的,下面這篇文章主要給大家介紹了關(guān)于Java報(bào)錯(cuò):ClassCastException問(wèn)題解決方法,需要的朋友可以參考下2024-07-07Java日常練習(xí)題,每天進(jìn)步一點(diǎn)點(diǎn)(59)
下面小編就為大家?guī)?lái)一篇Java基礎(chǔ)的幾道練習(xí)題(分享)。小編覺(jué)得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧,希望可以幫到你2021-08-08Apache Commons Math3學(xué)習(xí)之?dāng)?shù)值積分實(shí)例代碼
這篇文章主要介紹了Apache Commons Math3學(xué)習(xí)之?dāng)?shù)值積分實(shí)例代碼,涉及使用辛普森積分的例子,這里分享給大家,供需要的朋友參考。2017-10-10SpringBoot自定義動(dòng)態(tài)數(shù)據(jù)源的流程步驟
動(dòng)態(tài)數(shù)據(jù)源,本質(zhì)上是把多個(gè)數(shù)據(jù)源存儲(chǔ)在一個(gè)?Map?中,當(dāng)需要使用某一個(gè)數(shù)據(jù)源時(shí),使用?key?獲取指定數(shù)據(jù)源進(jìn)行處理,本文將給大家介紹一下SpringBoot自定義動(dòng)態(tài)數(shù)據(jù)源的流程步驟,需要的朋友可以參考下2024-06-06