成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

看看 JVM 是怎樣消化字節碼指令的

云計算 虛擬化
不知道你有沒有覺得, JVM 也像我們人或者生物一樣,執行的過程一如咱們吃東西。只不過他吃的是 .class 文件,把其中認為有營養的常量池、字節碼指令等消化吸收,同時一邊把垃圾處理掉,在最后不用的時候,再把全部的垃圾unload。

 寫文章,標題真是個頭疼的事兒。寫的偏技術點,可能被認為太生硬。寫的吸引點兒,可能被認為是「廣告」,看著每次閱讀量都不到 3%,不由得「老淚縱橫」...

如果本文對你有幫助,轉發到朋友圈和「在看」支持一下啊。

扯遠了,回到我們的正題。不知道你有沒有覺得, JVM 也像我們人或者生物一樣,執行的過程一如咱們吃東西。只不過他吃的是 .class 文件,把其中認為有營養的常量池、字節碼指令等消化吸收,同時一邊把垃圾處理掉,在最后不用的時候,再把全部的垃圾unload。

整個 .class 文件中, 字節碼指令是很重要的一個部分,所有方法內的邏輯,都是通過這些指令來完成操作。

今天咱就一起來看看指令。

指令

我們前面說過,指令集(ISA)的實現,一般有兩種形式

  • 基于寄存器實現
  • 基于棧的實現

兩者各有優劣,但對于 JVM 來說,設計者在初期就已經明確了場景和目標,所以JVM實現的指令集是基于棧實現的,具有指令數量少,格式簡單,操作數少,易于理解和實現等等特點。

一般一個典型的指令集系統中,需要實現的操作分為以下幾類:

  • 數據傳送
  • 運算:包括算術運算、邏輯運算和移位運算等
  • 流程控制:控制轉移、條件轉移、無條件轉移以及復合條件轉移
  • 中斷、同步、圖形處理(硬件)等

用通俗的語言描述的話,JVM 這些指令,按革命分工不同,大概干的事兒有:

1.像搬運工一樣,來回在局部變量區和操作數棧這兩個地方來回挪動數據。比如從局部變量區加載到操作數棧,計算一下,再保存回局部變量區。

  • 這類的命令又根據搬運方向的不同,分為從局部變量表 到 操作數棧的load指令:iload_n、lload_n、aload_n等,分別又對應到不同的操作數類型上,第一個字母基本都代表類型,i -> int, l -> long, a -> 引用。后面的n是數字。
  • 以及分為從 操作數棧到局部變量表 的store指令:istore_n、lstore_n、astore_n等等,類型同上。
  • 還有一些是從常量池直接加載到棧頂的,像ldc、bipush、iconst_i等。

2.像手藝人一樣,做些打磨加工的工作,把石頭做成雕塑類似的類型轉換。比如把int 轉成long,把double 轉成int這些,對應的JVM 指令是i2l和d2i 2前面是源類型,后面是目標類型。

3.新的生命的孕育,像對象的創建、數組的創建等,以及對類型的操作。創建一個新的類實例 new, 新建一個數組 newarray比如getstatic 是訪問類的static 域 、getfield 獲取類的實例域 判斷對象是否屬于特定類型的instanceof

4.像紅綠燈一樣,指導道路的通行方向,來控制程序流程。有條件的轉移:像咱們常用的 if (x == 1) 這種,到了字節碼的時候,就變成了if_icmpne還有像try-catch字節碼里常看到的 goto,做無條件的跳轉。還有一些復合條件的轉移,像tableswitch 來支持 switch 語法。而對于 switch 能支持 String ,則是通過編譯的時候,把 String 對應的 hashCode取出來,做為int 值來使用,通過 lookupswitch 來處理 case 不連續的情形。

5.像你我程序員一樣 :-),在 PM 提過來需求之后, 負責把它實現出來,在JVM里這些是運算指令的活兒。比如int 加法iadd, int 減法isub, 遞增iinc這些。

6.還有些函數的調用,執行的返回等等,對于靜態和非靜態方法,對應的指令稍有差別。像 invokevirtual是調用普通實例方法的,invokestatic 是調用類的靜態方法的。以及類的初始化方法init,是通過 invokespecial調用的。方法調用完,一般通過 return結束調用,返回 void, 如果是返回類型數據,則是return,這里的T 和咱們前面說的各種代表數據類型的一樣,比如返回int類型的值,對應的指令是 ireturn。

7.異常的情況,通過 athrow指令,拋出去。異常的處理原理,可以參考上一篇文章:你寫下的try-catch-finally,在JVM看來不過是...

用來學習的工具

如果對這一部分感興趣,日常開發中,有幾個小工具可以使用。

1.像Java 自帶的javap 開箱即用。

2.一個圖形界面的工具jclasslib

  • 下載地址:https://github.com/ingokegel/jclasslib/releases

3.IDEA 里面可以安裝工具 jclasslib 對應的插件。

 

相比 javap,圖形界面工具除了使用方便,不用命令行,可以方便查看自己編寫的代碼生成的字節碼到底是哪些外,同時各個方法內對應的字節碼指令,只要點擊一下就能跳轉到指令的官方說明,也方便理解和學習。

 

比如上面的 iconst_2 指令,會跳轉到 Oracle 的這個說明頁面

 

 

責任編輯:武曉燕 來源: Tomcat那些事兒
相關推薦

2024-07-30 14:01:51

Java字節碼JVM?

2023-07-03 08:11:48

java字節碼字段

2024-10-29 10:54:07

2018-04-04 15:05:17

虛擬機字節碼引擎

2022-08-11 13:34:13

SDK監控多環境

2020-08-05 12:27:18

Go語言碼農

2024-08-30 08:59:15

2022-01-17 11:28:55

JVM 虛擬機Java

2016-11-02 09:13:30

2018-07-13 15:15:09

2023-09-01 08:59:57

2013-03-04 11:10:03

JavaJVM

2024-09-20 14:46:49

Python函數編譯

2024-05-11 07:56:07

編程語言Java字節碼

2022-07-05 08:34:22

虛擬機JavaJVM

2022-02-16 22:50:28

JVMJDKJRE

2024-11-06 13:03:06

2010-09-27 13:09:29

JVM指令系統

2023-10-07 08:41:42

JavaJVM

2011-12-01 14:56:30

Java字節碼
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 蜜桃视频成人 | 91社影院在线观看 | 国产午夜精品一区二区三区嫩草 | 精品一区二区三区中文字幕 | 99精品热视频 | 精品国产一区二区三区久久久蜜月 | 中文字幕免费观看 | 亚洲激精日韩激精欧美精品 | 先锋资源网站 | 一区中文字幕 | 天堂一区二区三区四区 | 亚洲成人国产 | 99久久99| 婷婷综合五月天 | 久久久久久国产精品免费 | 一区二区免费在线 | 91久久久久久久久久久 | 亚洲综合日韩精品欧美综合区 | 黄色一级特级片 | 高清视频一区 | 欧美在线视频一区 | 日韩成人一区 | 天天操夜夜操 | 亚洲人精品午夜 | 婷婷狠狠 | 日韩在线中文字幕 | 99久久国产 | 国产成人精品免费视频大全最热 | 亚洲国产精品久久久 | 亚洲高清视频在线观看 | 91就要激情 | 日日夜夜精品免费视频 | 亚洲91精品 | 日韩一区二区av | 91视视频在线观看入口直接观看 | 日本成人在线观看网站 | chinese中国真实乱对白 | 综合亚洲视频 | 亚洲精品www | 欧美精品二区 | www.久|