国产chinesehd精品酒店,邱淑贞aa极毛片,国产在线色视频,玖玖爱zh综合伊人久久

網(wǎng)站首頁(yè)
手機(jī)版

java源代碼運(yùn)行操作方法 java的源代碼在哪個(gè)文件

更新時(shí)間:2024-07-01 18:02:48作者:未知

java源代碼運(yùn)行操作方法 java的源代碼在哪個(gè)文件

概覽

計(jì)算機(jī)能識(shí)別的是機(jī)器指令碼,簡(jiǎn)稱(chēng)機(jī)器碼。機(jī)器碼是二進(jìn)制的,計(jì)算機(jī)可以直接識(shí)別,但與人類(lèi)的語(yǔ)言差別太大,不容易被人理解和記憶。后來(lái),就誕生了各種高級(jí)語(yǔ)言,人們用高級(jí)語(yǔ)言編寫(xiě)程序,然后通過(guò)把程序解釋或編譯成機(jī)器碼。

比如python,就是一種解釋型語(yǔ)言。Python程序源碼不需要編譯,可以直接從源代碼運(yùn)行程序。Python解釋器將源代碼轉(zhuǎn)換為字節(jié)碼,然后把編譯好的字節(jié)碼轉(zhuǎn)發(fā)到Python虛擬機(jī)(PVM)中進(jìn)行執(zhí)行。

而C語(yǔ)言就是典型的編譯型語(yǔ)言,需要先用編譯器編譯成機(jī)器碼,比如我們通常用gcc來(lái)編譯C語(yǔ)言程序:

$ gcc hello.c # 編譯$ ./a.out # 執(zhí)行hello world!

那Java是解釋型語(yǔ)言還是編譯型語(yǔ)言呢?

Java是兼具編譯型語(yǔ)言與解釋型語(yǔ)言的特點(diǎn)的。程序員寫(xiě)好Java程序后,需要先用javac編譯成JVM可以使用的字節(jié)碼class文件。然后JVM加載class文件,逐條解釋執(zhí)行。在運(yùn)行過(guò)程中,部分熱點(diǎn)代碼會(huì)被即時(shí)編譯器編譯成機(jī)器碼。

源代碼到字節(jié)碼

Java語(yǔ)言的源代碼是.java為后綴的文件。當(dāng)然現(xiàn)在有很多其它高級(jí)語(yǔ)言也架構(gòu)在JVM上,比如groovy、kotlin等。源代碼是給人看的,易于閱讀、理解、維護(hù)。

源代碼經(jīng)過(guò)編譯后得到字節(jié)碼,字節(jié)碼是給JVM用的,易于理解和識(shí)別。字節(jié)碼是以.class為后綴,其格式是JVM的一套規(guī)劃,字節(jié)碼人類(lèi)對(duì)照文檔也是勉強(qiáng)能看懂的,只是相對(duì)Java代碼來(lái)說(shuō)要難以理解一些而已。

Java與Python不同,Python不需要編譯字節(jié)碼文件(當(dāng)然,Python也提供了這種操作),編譯是一個(gè)自動(dòng)的過(guò)程,一般不會(huì)在意它的存在。而Java會(huì)先編譯好字節(jié)碼文件,這樣JVM直接讀字節(jié)碼文件,可以節(jié)省加載模塊的時(shí)間,提高效率。同時(shí)字節(jié)碼的形式也增加了反向工程的難度,可以保護(hù)源代碼(當(dāng)然,也可以被反編譯)。

熟悉JVM的小伙伴都知道,它有一個(gè)“類(lèi)加載過(guò)程”,可以說(shuō)是老八股文了,經(jīng)常會(huì)被面試官問(wèn)到。類(lèi)加載過(guò)程其實(shí)就是指的JVM從讀取一個(gè)class文件到準(zhǔn)備好這個(gè)類(lèi),以及最后銷(xiāo)毀的整個(gè)過(guò)程。

所以class文件其實(shí)是以“類(lèi)”為單位的,這跟java文件有一些不同。如果我們?cè)谝粋€(gè)Java文件里面聲明多個(gè)類(lèi),用Javac編譯出來(lái)會(huì)發(fā)現(xiàn)有多個(gè)class文件。比如我們聲明一個(gè)One.java文件:

public class One { public class OneInner {} private class OnePrivateInner {} public static class OneStaticInner {} private static class OneprivateStaticInner {}}class Two{}

用Javac編譯后,會(huì)出現(xiàn)6個(gè)class文件

$ ls'One$OneInner.class' 'One$OneStaticInner.class' One.class Two.class'One$OnePrivateInner.class' 'One$OneprivateStaticInner.class' One.java

字節(jié)碼到機(jī)器碼

加載和使用字節(jié)碼

前面提到,JVM會(huì)加載class文件,然后加載后的Java類(lèi)會(huì)被存放于方法區(qū)(Method Area)中。從指定的類(lèi)的main方法作為入口開(kāi)始運(yùn)行。實(shí)際運(yùn)行時(shí),虛擬機(jī)會(huì)執(zhí)行方法區(qū)內(nèi)的代碼,JVM會(huì)使用堆和棧來(lái)存儲(chǔ)運(yùn)行時(shí)數(shù)據(jù)。

每當(dāng)進(jìn)入一個(gè)方法,Java虛擬機(jī)會(huì)在當(dāng)前線程的棧中生成一個(gè)棧幀,存放局部變量以及字節(jié)碼的操作數(shù),這個(gè)棧幀的大小是提前計(jì)算好的。

退出方法時(shí),不管是正常返回還是異常返回,Java虛擬機(jī)均會(huì)彈出當(dāng)前線程的當(dāng)前棧幀,并將之舍棄。

Java虛擬機(jī)需要將字節(jié)碼翻譯成機(jī)器碼,才能讓機(jī)器執(zhí)行。這個(gè)過(guò)程有兩種形式,一種是解釋執(zhí)行,即逐條將字節(jié)碼翻譯成機(jī)器碼并執(zhí)行;另一種是即時(shí)編譯(Just-In-Time compilation,JIT),即將一個(gè)方法中包含的所有字節(jié)碼編譯成機(jī)器碼后再執(zhí)行。

分層編譯

這兩種編譯方式是怎么協(xié)作的呢?

HotSpot虛擬機(jī)包含多個(gè)即時(shí)編譯器C1、C2和Graal。其中,Graal是一個(gè)實(shí)驗(yàn)性質(zhì)的即時(shí)編譯器,可以通過(guò)參數(shù) -XX:+
UnlockExperimentalVMOptions -XX:+UseJVMCICompiler啟用,并且替換C2。

C1和C2各有優(yōu)劣,適用于不同的場(chǎng)景。在Java 7以前,只能選擇一種編譯器。C1編譯快,但生成的代碼執(zhí)行效率一般,常用于對(duì)于執(zhí)行時(shí)間較短的,或者對(duì)啟動(dòng)性能有要求的程序,常用于客戶端;C2編譯慢,但生成的代碼執(zhí)行效率快,適用于對(duì)于執(zhí)行時(shí)間較長(zhǎng)的,或者對(duì)峰值性能有要求的程序,常用于服務(wù)端。實(shí)際上,C1對(duì)應(yīng)的參數(shù)是client,C2對(duì)應(yīng)的參數(shù)是server,也跟它們的應(yīng)用場(chǎng)景比較匹配。

Java7引入了分層編譯的概念,綜合了C1的啟動(dòng)性能優(yōu)勢(shì)和C2的峰值性能優(yōu)勢(shì)。C1和C2編譯出的機(jī)器碼是不同的。C2代碼的執(zhí)行效率要比C1代碼高出30%以上。機(jī)器碼越快,需要的編譯時(shí)間就越長(zhǎng)。分層編譯是一種折衷的方式,既能夠滿足部分不那么熱的代碼能夠在短時(shí)間內(nèi)編譯完成,也能滿足很熱的代碼能夠擁有最好的優(yōu)化。

熱點(diǎn)代碼

那怎么判定熱點(diǎn)代碼呢?

JVM會(huì)收集方法的運(yùn)行時(shí)信息,主要包括調(diào)用次數(shù)和循環(huán)回邊的次數(shù)。當(dāng)方法的調(diào)用次數(shù)和循環(huán)回邊的次數(shù)的和,超過(guò)指定閾值時(shí),便會(huì)觸發(fā)即時(shí)編譯。

循環(huán)回邊次數(shù)可以簡(jiǎn)單理解為方法內(nèi)部代碼的循環(huán)次數(shù),比如方法內(nèi)部有for循環(huán)或while循環(huán)。

在分層編譯出現(xiàn)前,這個(gè)閾值是由參數(shù)-XX:CompileThreshold指定的,使用C1時(shí),該值為1500;使用C2時(shí),該值為10000。

當(dāng)啟用分層編譯時(shí),JVM使用另一套閾值系統(tǒng)。在這套系統(tǒng)中,閾值的大小是動(dòng)態(tài)調(diào)整的。JVM將閾值與某個(gè)系數(shù) s 相乘。該系數(shù)與當(dāng)前待編譯的方法數(shù)目成正相關(guān),與編譯線程的數(shù)目成負(fù)相關(guān)。

編譯線程

默認(rèn)情況下編譯線程的總數(shù)目是根據(jù)處理器數(shù)量來(lái)調(diào)整的。Java 虛擬機(jī)會(huì)將這些編譯線程按照1:2的比例分配給 C1和C2(至少各為1個(gè))。舉個(gè)例子,對(duì)于一個(gè)四核機(jī)器來(lái)說(shuō),總的編譯線程數(shù)目為3,其中包含一個(gè)C1編譯線程和兩個(gè)C2編譯線程。

機(jī)器資源太少的時(shí)候,也可能各1個(gè)線程。

用arthas可以看到編譯線程:

可以看到,它們的ID是-1,優(yōu)先級(jí)也是-1。我們自己創(chuàng)建的線程優(yōu)先級(jí)是0~10,所以編譯線程的優(yōu)先級(jí)會(huì)更高一些。

總結(jié)

一句話來(lái)總結(jié)Java程序是怎么在機(jī)器上運(yùn)行的呢?首先Java程序員編寫(xiě)Java代碼,然后Java代碼會(huì)被編譯成class文件,多個(gè)class文件會(huì)被打包成jar包或者war包。然后JVM加載class文件,然后先解釋執(zhí)行為字節(jié)碼。程序運(yùn)行一段時(shí)間后,JVM會(huì)通過(guò)方法調(diào)用次數(shù)和循環(huán)持續(xù)判斷一個(gè)方法是否為熱點(diǎn)代碼,如果是,會(huì)使用分層編譯,通過(guò)編譯線程編譯成字節(jié)碼,在機(jī)器上運(yùn)行。

本文標(biāo)簽: [db:關(guān)鍵詞]  

為您推薦

科龍空調(diào)手機(jī)萬(wàn)能遙控器(科龍空調(diào)萬(wàn)能遙控器)

科龍百思特網(wǎng)空調(diào)故障(科龍空調(diào)手機(jī)萬(wàn)能遙控器)1-15 19:19蔣二哥love14174今天維修了一臺(tái)科龍的3匹圓柱柜機(jī),上門(mén)檢查的時(shí)候發(fā)現(xiàn)室外機(jī)沒(méi)有運(yùn)轉(zhuǎn),拆開(kāi)外機(jī)頂蓋,測(cè)量直流310伏沒(méi)有電壓,一

2024-07-01 18:02

java源代碼運(yùn)行操作方法 java的源代碼在哪個(gè)文件

概覽計(jì)算機(jī)能識(shí)別的是機(jī)器指令碼,簡(jiǎn)稱(chēng)機(jī)器碼。機(jī)器碼是二進(jìn)制的,計(jì)算機(jī)可以直接識(shí)別,但與人類(lèi)的語(yǔ)言差別太大,不容易被人理解和記憶。后來(lái),就誕生了各種高級(jí)語(yǔ)言,人們用高級(jí)語(yǔ)言編寫(xiě)程序,然后通過(guò)把程序解釋或

2024-07-01 18:02

生活中的無(wú)線網(wǎng)絡(luò)實(shí)例(生活中的無(wú)線網(wǎng)絡(luò)實(shí)例圖)

無(wú)線局域網(wǎng)獲得信息的途徑有很多,但最快、最迅速、最豐富的自然無(wú)過(guò)于網(wǎng)絡(luò)了,網(wǎng)絡(luò)可以把地球變成咱們的村子,也可以讓我們從農(nóng)民變成時(shí)代的弄潮兒。連入網(wǎng)絡(luò)的方式太多了,不過(guò)現(xiàn)在是講究效率的時(shí)候,選擇當(dāng)然是寬

2024-07-01 18:02

24口光口網(wǎng)絡(luò)交換機(jī)(24口光口網(wǎng)絡(luò)交換機(jī)功率)

如今,千兆交換機(jī)作為網(wǎng)絡(luò)連接的主要設(shè)備,在網(wǎng)絡(luò)建設(shè)中扮演著越來(lái)越重要的角色,被廣泛應(yīng)用于企業(yè)網(wǎng)絡(luò)中,因此選擇合適的千兆交換機(jī)尤為重要。目前,市面上存在眾多適用于中小型企業(yè)的千兆交換機(jī),例如飛速(FS)

2024-07-01 18:01

手寫(xiě)識(shí)別系統(tǒng)怎么安裝(手寫(xiě) 識(shí)別)

千彩手寫(xiě)識(shí)別系統(tǒng)(手寫(xiě)識(shí)別系統(tǒng)怎么安裝)2018-08-30 09:33程序員小新人學(xué)習(xí)手寫(xiě)數(shù)字識(shí)別算法的設(shè)計(jì)與實(shí)現(xiàn)本文使用python基于TensorFlow設(shè)計(jì)手寫(xiě)數(shù)字識(shí)別算法,并編程實(shí)現(xiàn)GUI界

2024-07-01 18:01

卡扣式cpu風(fēng)扇怎么拆 卡扣cpu風(fēng)扇正確拆卸高清圖

cpu風(fēng)扇怎么拆下來(lái)(卡扣式cpu風(fēng)扇怎么拆)021-0百思特網(wǎng)8-13 23:31江渚小閣筆記本電腦用的時(shí)間長(zhǎng)了,CPU風(fēng)扇的出風(fēng)口會(huì)沾上灰塵;如果所處的環(huán)境灰塵較多的話,風(fēng)扇口會(huì)積很厚的灰塵,甚至

2024-07-01 18:00