- 深入理解JVM字節碼
- 張亞
- 631字
- 2020-06-02 18:27:54
2.1 字節碼概述
Java虛擬機的指令由一個字節長度的操作碼(opcode)和緊隨其后的可選的操作數(operand)構成,如下所示。
<opcode> [<operand1>, <operand2>]
比如將整型常量100壓棧到棧頂的指令是bipush 100,其中bipush是操作碼,100是操作數。字節碼(bytecode)名字的由來是操作碼的長度用一個字節表示。因為操作碼長度只有一個字節長度,這使得編譯后的字節碼文件非常小巧緊湊,但也直接限制整個JVM操作碼指令集的數量最多只能有256個,目前已經使用超過了200個。
大部分字節碼指令是與類型相關的,比如ireturn指令用于返回一個int類型的數據,dreturn指令用于返回一個double類型的數據,freturn指令用于返回一個float類型的數據,這也使得字節碼實際的指令類型遠小于200個。
字節碼使用大端序(Big-Endian)表示,即高位在前,低位在后的方式,比如字節碼getfield 0002,表示的是getfiled 0x00<<8 | 0x02(getfield #2)。
字節碼并不是某種虛擬CPU的機器碼,而是一種介于源碼和機器碼中間的一種抽象表示方法,不過字節碼通過JIT(Just In Time)技術可以被進一步編譯成機器碼。
根據字節碼的不同用途,字節碼指令可以大概分為如下幾類:
? 加載和存儲指令,比如iload將一個整型值從局部變量表加載到操作數棧;
? 控制轉移指令,比如條件分支ifeq;
? 對象操作,比如創建類實例的指令new;
? 方法調用,比如invokevirtual指令用于調用對象的實例方法;
? 運算指令和類型轉換,比如加法指令iadd;
? 線程同步,比如monitorenter和monitorexit這兩條指令用于支持synchronized關鍵字的語義;
? 異常處理,比如athrow顯式拋出異常。
字節碼是運行在JVM上的,為了能弄懂字節碼,需要對JVM的運行原理有所了解。接下來以Java虛擬機棧為切入點講解字節碼在JVM上執行的細節。
- 從零開始:數字圖像處理的編程基礎與應用
- Unity 2020 Mobile Game Development
- C# 從入門到項目實踐(超值版)
- Learning Informatica PowerCenter 10.x(Second Edition)
- Python零基礎快樂學習之旅(K12實戰訓練)
- Microsoft System Center Orchestrator 2012 R2 Essentials
- UML 基礎與 Rose 建模案例(第3版)
- Yii Project Blueprints
- The Professional ScrumMaster’s Handbook
- SSM開發實戰教程(Spring+Spring MVC+MyBatis)
- Java零基礎實戰
- Go語言底層原理剖析
- 深度實踐KVM:核心技術、管理運維、性能優化與項目實施
- 視窗軟件設計和開發自動化:可視化D++語言
- HTML并不簡單:Web前端開發精進秘籍