偷偷摘套内射激情视频,久久精品99国产国产精,中文字幕无线乱码人妻,中文在线中文a,性爽19p

看看 JVM 是怎樣消化字節(jié)碼指令的

云計(jì)算 虛擬化
不知道你有沒(méi)有覺(jué)得, JVM 也像我們?nèi)嘶蛘呱镆粯?,?zhí)行的過(guò)程一如咱們吃東西。只不過(guò)他吃的是 .class 文件,把其中認(rèn)為有營(yíng)養(yǎng)的常量池、字節(jié)碼指令等消化吸收,同時(shí)一邊把垃圾處理掉,在最后不用的時(shí)候,再把全部的垃圾unload。

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

如果本文對(duì)你有幫助,轉(zhuǎn)發(fā)到朋友圈和「在看」支持一下啊。

扯遠(yuǎn)了,回到我們的正題。不知道你有沒(méi)有覺(jué)得, JVM 也像我們?nèi)嘶蛘呱镆粯?,?zhí)行的過(guò)程一如咱們吃東西。只不過(guò)他吃的是 .class 文件,把其中認(rèn)為有營(yíng)養(yǎng)的常量池、字節(jié)碼指令等消化吸收,同時(shí)一邊把垃圾處理掉,在最后不用的時(shí)候,再把全部的垃圾unload。

整個(gè) .class 文件中, 字節(jié)碼指令是很重要的一個(gè)部分,所有方法內(nèi)的邏輯,都是通過(guò)這些指令來(lái)完成操作。

今天咱就一起來(lái)看看指令。

指令

我們前面說(shuō)過(guò),指令集(ISA)的實(shí)現(xiàn),一般有兩種形式

  • 基于寄存器實(shí)現(xiàn)
  • 基于棧的實(shí)現(xiàn)

兩者各有優(yōu)劣,但對(duì)于 JVM 來(lái)說(shuō),設(shè)計(jì)者在初期就已經(jīng)明確了場(chǎng)景和目標(biāo),所以JVM實(shí)現(xiàn)的指令集是基于棧實(shí)現(xiàn)的,具有指令數(shù)量少,格式簡(jiǎn)單,操作數(shù)少,易于理解和實(shí)現(xiàn)等等特點(diǎn)。

一般一個(gè)典型的指令集系統(tǒng)中,需要實(shí)現(xiàn)的操作分為以下幾類:

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

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

1.像搬運(yùn)工一樣,來(lái)回在局部變量區(qū)和操作數(shù)棧這兩個(gè)地方來(lái)回挪動(dòng)數(shù)據(jù)。比如從局部變量區(qū)加載到操作數(shù)棧,計(jì)算一下,再保存回局部變量區(qū)。

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

2.像手藝人一樣,做些打磨加工的工作,把石頭做成雕塑類似的類型轉(zhuǎn)換。比如把int 轉(zhuǎn)成long,把double 轉(zhuǎn)成int這些,對(duì)應(yīng)的JVM 指令是i2l和d2i 2前面是源類型,后面是目標(biāo)類型。

3.新的生命的孕育,像對(duì)象的創(chuàng)建、數(shù)組的創(chuàng)建等,以及對(duì)類型的操作。創(chuàng)建一個(gè)新的類實(shí)例 new, 新建一個(gè)數(shù)組 newarray比如getstatic 是訪問(wèn)類的static 域 、getfield 獲取類的實(shí)例域 判斷對(duì)象是否屬于特定類型的instanceof

4.像紅綠燈一樣,指導(dǎo)道路的通行方向,來(lái)控制程序流程。有條件的轉(zhuǎn)移:像咱們常用的 if (x == 1) 這種,到了字節(jié)碼的時(shí)候,就變成了if_icmpne還有像try-catch字節(jié)碼里??吹降? goto,做無(wú)條件的跳轉(zhuǎn)。還有一些復(fù)合條件的轉(zhuǎn)移,像tableswitch 來(lái)支持 switch 語(yǔ)法。而對(duì)于 switch 能支持 String ,則是通過(guò)編譯的時(shí)候,把 String 對(duì)應(yīng)的 hashCode取出來(lái),做為int 值來(lái)使用,通過(guò) lookupswitch 來(lái)處理 case 不連續(xù)的情形。

5.像你我程序員一樣 :-),在 PM 提過(guò)來(lái)需求之后, 負(fù)責(zé)把它實(shí)現(xiàn)出來(lái),在JVM里這些是運(yùn)算指令的活兒。比如int 加法iadd, int 減法isub, 遞增iinc這些。

6.還有些函數(shù)的調(diào)用,執(zhí)行的返回等等,對(duì)于靜態(tài)和非靜態(tài)方法,對(duì)應(yīng)的指令稍有差別。像 invokevirtual是調(diào)用普通實(shí)例方法的,invokestatic 是調(diào)用類的靜態(tài)方法的。以及類的初始化方法init,是通過(guò) invokespecial調(diào)用的。方法調(diào)用完,一般通過(guò) return結(jié)束調(diào)用,返回 void, 如果是返回類型數(shù)據(jù),則是return,這里的T 和咱們前面說(shuō)的各種代表數(shù)據(jù)類型的一樣,比如返回int類型的值,對(duì)應(yīng)的指令是 ireturn。

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

用來(lái)學(xué)習(xí)的工具

如果對(duì)這一部分感興趣,日常開(kāi)發(fā)中,有幾個(gè)小工具可以使用。

1.像Java 自帶的javap 開(kāi)箱即用。

2.一個(gè)圖形界面的工具jclasslib

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

3.IDEA 里面可以安裝工具 jclasslib 對(duì)應(yīng)的插件。

 

相比 javap,圖形界面工具除了使用方便,不用命令行,可以方便查看自己編寫的代碼生成的字節(jié)碼到底是哪些外,同時(shí)各個(gè)方法內(nèi)對(duì)應(yīng)的字節(jié)碼指令,只要點(diǎn)擊一下就能跳轉(zhuǎn)到指令的官方說(shuō)明,也方便理解和學(xué)習(xí)。

 

比如上面的 iconst_2 指令,會(huì)跳轉(zhuǎn)到 Oracle 的這個(gè)說(shuō)明頁(yè)面

 

 

責(zé)任編輯:武曉燕 來(lái)源: Tomcat那些事兒
相關(guān)推薦

2024-07-30 14:01:51

Java字節(jié)碼JVM?

2023-07-03 08:11:48

java字節(jié)碼字段

2024-10-29 10:54:07

2018-04-04 15:05:17

虛擬機(jī)字節(jié)碼引擎

2022-08-11 13:34:13

SDK監(jiān)控多環(huán)境

2020-08-05 12:27:18

Go語(yǔ)言碼農(nóng)

2024-08-30 08:59:15

2016-11-02 09:13:30

2022-01-17 11:28:55

JVM 虛擬機(jī)Java

2018-07-13 15:15:09

2013-03-04 11:10:03

JavaJVM

2023-09-01 08:59:57

2024-09-20 14:46:49

Python函數(shù)編譯

2024-05-11 07:56:07

編程語(yǔ)言Java字節(jié)碼

2022-07-05 08:34:22

虛擬機(jī)JavaJVM

2024-11-06 13:03:06

2022-02-16 22:50:28

JVMJDKJRE

2010-09-27 13:09:29

JVM指令系統(tǒng)

2023-10-07 08:41:42

JavaJVM

2019-10-30 08:45:21

JS代碼NodeJS
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)