java Java源程序如何變成Java字節(jié)碼?
Java源程序如何變成Java字節(jié)碼?默認(rèn)情況下,編譯器會(huì)將java文件轉(zhuǎn)換為字節(jié)碼,以便計(jì)算機(jī)能夠理解它,并手動(dòng)使用CMD javacxxxx.java文件找到的運(yùn)行時(shí)字節(jié)碼與原始字節(jié)碼匹配。你在找
Java源程序如何變成Java字節(jié)碼?
默認(rèn)情況下,編譯器會(huì)將java文件轉(zhuǎn)換為字節(jié)碼,以便計(jì)算機(jī)能夠理解它,并手動(dòng)使用CMD javacxxxx.java文件找到的運(yùn)行時(shí)字節(jié)碼與原始字節(jié)碼匹配。你在找合適的地方。oraclejdk8/openjdk8的熱點(diǎn)VM仍然將字節(jié)碼放在constmethod對(duì)象的末尾。
例如,F(xiàn)N()的第一個(gè)字節(jié)碼放在類文件的左側(cè),在運(yùn)行時(shí)找到的字節(jié)碼放在右側(cè):這個(gè)“0xca”操作碼是一個(gè)斷點(diǎn),表示您在FN()的入口放置了一個(gè)Java級(jí)別的斷點(diǎn)。然后dup后的指令(0x59):原來的指令是LDC(0x12),重寫的指令是hotspot VM解釋器的內(nèi)部字節(jié)碼指令ufastALDC(0xe5),內(nèi)容也完全對(duì)應(yīng)。下一個(gè):你很困惑。在運(yùn)行時(shí)重寫后的字節(jié)碼仍然是0x06(您只需將其視為0x0b)。
類文件中某些字節(jié)碼指令的操作數(shù)看起來與運(yùn)行時(shí)的不同,因?yàn)閔otspot VM在加載類時(shí)會(huì)重寫字節(jié)碼,從常量池索引(constant pool Index)訂閱某些指令的操作數(shù)到常量池緩存索引。這是因?yàn)檫@些指令需要引用比常量池條目槽更多的信息,并且需要打開更大的數(shù)據(jù)結(jié)構(gòu)來保存常量池條目的內(nèi)容。
Java 為什么要編譯為字節(jié)碼?
一個(gè)java項(xiàng)目包含許多帶有“.”的源代碼文件。Java“后綴。除了直接在IDE中調(diào)試外,一般來說,代碼類型是jar包或war包,最后打包的jar包或war包被發(fā)送到在線服務(wù)器進(jìn)行部署。
部署的方法有很多,最基本的方法是通過Tomcat容器進(jìn)行部署,也可以通過Java命令手動(dòng)運(yùn)行jar包中的代碼。
。
在Java代碼打包過程中,源代碼通常被編譯成一個(gè)字節(jié)碼文件,并帶有“?!邦悺焙缶Y。JVM只能識(shí)別和解釋字節(jié)碼文件類。
對(duì)于已編譯的類字節(jié)碼,您需要使用諸如Java-jar之類的命令來運(yùn)行已編寫的代碼;一旦使用Java命令,此時(shí)您將實(shí)際啟動(dòng)JVM進(jìn)程。
JVM進(jìn)程將負(fù)責(zé)運(yùn)行這些類字節(jié)碼文件,這相當(dāng)于運(yùn)行我們編寫的代碼。
要運(yùn)行這些類字節(jié)碼文件中的代碼,JVM將使用類加載器將編譯后的類字節(jié)碼文件加載到JVM的內(nèi)存中
執(zhí)行加載到內(nèi)存中的類。當(dāng)JVM需要哪個(gè)類時(shí),它將使用類加載器來加載相應(yīng)的類。