日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

小师妹学JVM之:java的字节码byte code简介

發布時間:2024/2/28 编程问答 48 豆豆
生活随笔 收集整理的這篇文章主要介紹了 小师妹学JVM之:java的字节码byte code简介 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

文章目錄

  • 簡介
  • Byte Code的作用
  • 查看Byte Code字節碼
  • java Byte Code是怎么工作的
  • 總結

簡介

Byte Code也叫做字節碼,是連接java源代碼和JVM的橋梁,源代碼編譯成為字節碼,而字節碼又被加載進JVM中運行。字節碼怎么生成,怎么查看字節碼,隱藏在Byte Code背后的秘密是什么呢?快跟小師妹一起來看看吧。

Byte Code的作用

小師妹:F師兄,為什么Java需要字節碼呢?直接編譯成為機器碼不是更快嗎?

小師妹,Java的設計初衷是一次編寫,到處運行。為了兼容各個平臺的運行環境,java特別為各種平臺設計了JVM。

我們可以把JVM看做是一種抽象,對外提供了統一的接口。這樣我們只需要編寫符合JVM規范的代碼,即可在JVM中運行。

回想下之前我們提到過的java的執行過程:

  • 編寫java代碼文件比如Example.java
  • 使用java編譯器javac將源文件編譯成為Example.class文件
  • JVM加載生成的字節碼文件,將其轉換成為機器可以識別的native machine code執行
  • 小師妹:F師兄,我有一個大膽的想法,JVM的作用是將字節碼解釋或者編譯成為機器碼。然后在相應的運行環境中執行。那么有沒有可能,不需要JVM,不需要機器碼,而是直接在對應的平臺上執行字節碼呢?

    愛因斯坦說過沒有想像力的靈魂,就像沒有望遠鏡的天文臺。小師妹你這個想法很好,這種實現有個專業的說法叫做:Java processor。

    Java processor就是用硬件來實現的JVM。因此字節碼可以直接在Java processor中運行。

    其中比較出名的是Jazelle DBX,這是一個主要支持J2ME環境的硬件架構。為了提升java在手機端的執行速度。

    但是這樣做其實也是有缺點的,后面我們會講到,java字節碼中的指令非常非常多。所以如果用硬件來實現的話,就會非常非常復雜。

    一般來說Java processor不會實現全部的字節碼中的功能,只會提供部分的實現。

    查看Byte Code字節碼

    小師妹:F師兄,那使用javac編譯過后的class文件跟字節碼有什么關系呢?

    class文件中大部分都是byte code,其他的部分是一些meta data元數據信息。這些組合在一起就是class文件了。

    小師妹:F師兄,你說class文件是byte code,為什么我在IDE中打開的時候,直接顯示的是反編譯出來的源文件呢?

    小師妹,這是IDE的一個便利功能。因為大多數情況下,沒有人想去看class文件的Byte code的,大家都是想去看看這個class文件的源文件是什么樣的。

    我們舉個最簡單的例子:

    這個類中,我們定義了一個很簡單的testByteCode方法,里面定義了兩個變量,然后返回他們兩個的和。

    現在有兩種方法來查看這個類的Byte Code:

    第一種方法是用javap命令:

    javap -c ByteCodeUsage.class

    生成的結果如上所示。

    第二種方法就是在IDEA中,選中class文件,然后在view中選中show Bytecode:

    我們看下輸出結果:

    兩個的結果在顯示上面可能有細微的差異,但是并不影響我們后面對其的解析。

    java Byte Code是怎么工作的

    小師妹:F師兄,能講解一下這些byte code到底是怎么工作的嗎?

    首先我們要介紹一下JVM的實現是基于棧的結構的。為什么要基于棧的結構呢?那是因為棧是最適合用來實現function互相調用的。

    我們再回顧一下上面的testByteCode的字節碼。里面有很多iconst,istore的東西,這些東西被稱作Opcode,也就是一些基于棧的操作指令。

    上面講了java bytecode的操作指令其實有很多個。下面我們列出這些指令的部分介紹:

    實在是太多了,這里就不把所有的列出來了。

    我們看到的指令名字其實是一個助記詞,真實的Opcode是一個占用兩個字節的數字。

    下面我們來詳細解釋一下testByteCode方法:

    public int testByteCode();Code:0: iconst_11: istore_12: iconst_23: istore_24: iload_15: iload_26: iadd7: ireturn

    第一步,iconst_1將int 1加載到stack中。

    第二步,istore_1將入棧的int 1出棧,并存儲到變量1中。

    第三步,iconst_2將int 2入棧。

    第四步,istore_2將入棧的int 2出棧,并存儲到變量2中。

    第五步,iload_1將變量1中的值入棧。

    第六步,iload_2將變量2中的值入棧。

    第七步,iadd將棧中的兩個變量出棧,并相加。然后將結果入棧。

    第八步,ireturn將棧中的結果出棧。

    這幾步實際上完美的還原了我們在testByteCode方法中定義的功能。

    當然我們只介紹了最賤的byte code命令,通過這些簡單的命令可以組合成為更加復雜的java命令。

    總結

    本文介紹了java byte code的作用和具體的指令,并分析了一個簡單的例子來做說明。希望大家能夠掌握。

    本文的例子https://github.com/ddean2009/learn-java-base-9-to-20

    本文作者:flydean程序那些事

    本文鏈接:http://www.flydean.com/jvm-byte-code/

    本文來源:flydean的博客

    歡迎關注我的公眾號:程序那些事,更多精彩等著您!

    總結

    以上是生活随笔為你收集整理的小师妹学JVM之:java的字节码byte code简介的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。