1. 程式人生 > >Java位元組碼與Dalvik位元組碼

Java位元組碼與Dalvik位元組碼

  1. JVM語言無關性
  • JVM只與位元組碼關聯,而不與Java語言直接關聯。事實上,JRuby,Groovy等語言也可以由相應的編譯器編譯為位元組碼,然後由JVM解釋執行。甚至可以自己寫一個class位元組碼檔案,然後由JVM來執行。
  1. class類檔案結構
  • 任何一個class檔案都對應著唯一一個類或介面的定義資訊。

  • class檔案是一組8位元組為基礎單位的二進位制流,各個資料項完全按照規範要求排列,中間無空隙。資料項只有兩種:無符號數和表。

    • 無符號數分為u1,u2,u4,u8

    • 表是多個無符號數或者其他表作為資料項構成的複合資料型別,所有表都以_info結尾。

    • 由於中間無空隙,所以要表示同一型別,但長度不確定的資料時,一般會將資料長度放在前面,後面緊跟資料。

  • 位元組碼結構

這裡寫圖片描述

  • magic:4B,標示是Java class檔案,為0xCAFEBABE

  • version: class:檔案版本號。JVM必須拒絕執行任何超過其版本號的class檔案。

  • constant_pool: 常量池,最複雜的區域。

    • 放在最前面的為常量池計數器。由於index0用來表示了“不引用任何常量池”,故index都是從1開始的。計數也是從1開始的。

    • 常量池存放了兩大常量

       		a) 字面量:字串,常量值等
       		b) 符號引用:包括類的全限定名,欄位名稱和描述符,方法名稱和描述符。
      
  • access_flags: 訪問標誌

    由標誌位組成,包括class是類還是介面,是否public,是否abstract,是否final,是否enum,annotation等

  • this_class, super_class, interfaces: 類索引,父類索引和介面索引集合

  • fields:欄位集合表

  • methods:方法集合表。

  • attributes: 屬性表,

     		1) code:存放方法的位元組碼
     		2) constantValue:final欄位的常量值
     		3) Deprecated:被宣告為deprecated的方法和欄位
     		4) exceptions:異常表
     		5) EnclosingMethod:當類為區域性類(方法裡面的內部類)時,才有這個欄位。它表示類處在哪個方法中
     		6) InnerClasses:內部類列表
    
  1. 位元組碼指令
  • 方法編譯出的位元組碼會變成位元組碼指令,一般包含指令和運算元兩部分。

    • 對於Hotspot,由於採用了棧結構,運算元一般放在棧中,只需要入棧和出棧。故位元組碼中一般只需要指令即可

    • 對於dalvik,由於採用了register結構,運算元需要從指令中讀取,然後放到register中。故位元組碼中一般會包含指令和運算元。

    • 操作碼嚴格控制為1B,故只能定義256種指令。但大大縮小了位元組碼檔案大小

  • 大多數指令中包含了要處理的型別資訊,如iload fload

    但不可能所有的型別資訊都包含,因為只有256種指令。解決方法:byte short帶符號擴充套件為int,Boolean和char無符號擴充套件為int。故實際上,最終都是使用了int來作為運算型別。

  • 指令集:

    • load, store:將數值從運算元棧儲存到區域性變量表,或從區域性變量表載入到運算元棧中
    • add sub mul div rem neg shl or and xor inc cmpg:
      運算指令,加減乘除,移位,位或與異或,比較等
    • i2b,i2c:型別轉換
    • new,newarray,getfield,arraylength,instanceof:物件建立和訪問
    • pop pop2 swap dup dup2:運算元棧入棧和出棧
    • ifeq ifne goto ret:分支控制
    • invokeVirtual invokeInterface invokeStatic:方法呼叫和返回
    • athrow:異常處理
    • monitorenter,monitorexit:執行緒同步,用來支援synchronized關鍵字
  1. Dalvik位元組碼與Java位元組碼的區別
  1. JVM執行的是Java位元組碼,dalvik執行的是dalvik位元組碼。二者指令集不同

  2. dalvik可執行檔案體積更小。dalvik只有一個dex檔案(不使用dex分包情況下),所有類檔案共享同一個常量池,所以相同的常量只出現一次。

這裡寫圖片描述

  1. JVM基於棧,dalvik基於暫存器。暫存器與CPU緊耦合,速度遠遠快於基於記憶體的棧。基於暫存器使得程式碼執行速度快很多,但由於指令中要儲存運算元,故程式碼會稍大。

相關推薦

Java位元組Dalvik位元組

JVM語言無關性 JVM只與位元組碼關聯,而不與Java語言直接關聯。事實上,JRuby,Groovy等語言也可以由相應的編譯器編譯為位元組碼,然後由JVM解釋執行。甚至可以自己寫一個class

Java位元組Dalvik位元組

public class Hello {public int foo (int a,int b){return (a+b)*(a-b);}public static void main(String

java 位元組高效位元組流的區別

import java.io.BufferedInputStream; import java.io.BufferedOutputStream; import java.io.FileInputStream; import java.io.FileOutputStream;

業務代非業務代

需求 高內聚 出現 這一 包含 輔助 應用 intercept 用戶 1.什麽是業務代碼? 直接用於實現用戶需求的代碼就是業務代碼,比如用戶需要查詢某個數據,那麽直接查詢數據庫,返回結果的代碼,就是業務代碼。 2.什麽是非業務代碼? 輔助業務代碼,一般可以脫離業

發布的文件代源代不一樣的問題

最新 圖片 源代碼 .com bubuko src nbsp blog 分享圖片 發布的時候發現,發布的代碼不是最新的代碼 解決方法 發布的文件代碼與源代碼不一樣的問題

js代html代分離示例

RM request對象 失去焦點 html4 sans path 一個 字符串 mon 驗證用戶名是否存在的示例代碼引出該思想: <%@ page language="java" contentType="text/html; charset=UTF-8" p

主機位元組 網路位元組

一、位元組順序 是指佔用記憶體多於一個位元組型別的資料在記憶體中的存放順序。 計算機電路先處理低位位元組,效率比較高,因為計算都是從低位開始的。所以,計算機的內部處理都是小端位元組序。 但是,網路傳輸、檔案儲存、人類讀寫習慣使用大端位元組序。   java中一個int型資料

主機位元組網路位元組

1 主機位元組序 主機位元組序(host-byte)指的是處理器儲存資料的位元組順序。對於Inter x86處理器來說,將資料的不重要的部分儲存在低地址,重要的部分儲存在高地址,即低地址中儲存的是資料的低位元組位,高地址儲存的是資料的高位元組位。 int ip_Addre

主機位元組網路位元組序轉換

小端位元組序:即一個整數的高位位元組存放在記憶體中的高位地址處,低位位元組存放在記憶體中的低位地址處 大端位元組序:與小端位元組序剛好相反 現代的pc多采用小端位元組序,而java虛擬機器採用大端位元組序,網路採用的也是大端位元組序 所以在網路傳輸中通常我們需要進行位元組

主機位元組網路位元組序的轉換函式:htonl、ntohl、htons、ntohs

Part 1: htons函式具體解釋      在Linux和Windows網路程式設計時需要用到htons和htonl函式,用來將主機位元組順序轉換為網路位元組順序。      在Intel機器下,執行以下程式 int main() ...{    printf(

大端模式小端模式、網路位元組順序主機位元組順序(經典)

大端模式與小端模式 一、概念及詳解   在各種體系的計算機中通常採用的位元組儲存機制主要有兩種: big-endian和little-endian,即大端模式和小端模式。   先回顧兩個關鍵詞,MSB和LSB:   MSB:Most Significant Bit ---

網路程式設計--位元組序--主機位元組網路位元組序介紹及轉換

一、位元組序位元組序:是指整數在記憶體中儲存的順序。位元組序有兩種實現方式:小端位元組序(little endian):低位元組資料存放在記憶體低地址處,高位元組資料存放在記憶體高地址處。大端位元組序(bigendian):高位元組資料存放在低地址處,低位元組資料存放在高地址

Python Network Programming(4)---主機位元組網路位元組序之間的相互轉換

編寫低層網路應用時,或許需要處理通過電纜在兩臺裝置之間傳送的低層資料,這種操作中,需要把主機作業系統發出的資料轉換成網路格式,或者做逆向轉換,因為這兩種資料的表示方式不一樣。 位元組序相關見u

主機位元組網路位元組序的轉換:ntohl()htonl()

#!/usr/bin/env python #coding=utf-8 import socket def convert_integer(): data=1234 #32-bit prin

iOS--AVFoundation原生二維一維掃描

概述 實現二維碼和條形碼掃描,兩大開源元件ZBar與ZXing ZBar: 掃描靈敏性,記憶體較優,但“圓角二維碼”掃描比較困難。 ZXing: Google Code上的一個開源的條形碼掃描庫,是用java設計 而蘋果原生的AVFoundation掃描靈敏性和記憶

網路位元組順序主機位元組順序

不同的CPU有不同的位元組序型別 這些位元組序是指整數在記憶體中儲存的順序 這個叫做主機序 最常見的有兩種 1. Little endian:將低序位元組儲存在起始地址 2. Big endian:將高序位元組儲存在起始地址 LE little-endian 最符合人

網路位元組主機位元組

不同的CPU有不同的位元組序型別 這些位元組序是指整數在記憶體中儲存的順序 這個叫做主機序 最常見的有兩種 1. Little endian:將低序位元組儲存在起始地址 2. Big endian:將高序位元組儲存在起始地址 LE little-end

InstrumentationClassFileTransformer--位元組轉換工具

一個代理實現ClassFileTransformer介面用於改變執行時的位元組碼(class File),這個改變發生在jvm載入這個類之前。對所有的類載入器有效。 class File這個術語定義於虛擬機器規範3.1,指的是位元組碼的byte陣列,而不是檔案系統中的class檔案。

class檔案結構jvm位元組指令

https://blog.csdn.net/luckydog1991/article/details/51654964這篇文章詳細的介紹了class檔案和位元組碼指令 Class檔案結構 https://blog.csdn.net/tyrone1979/article/details/9

帶你玩轉Visual Studio——帶你理解多位元組編碼Unicode

轉自:http://blog.csdn.net/luoweifu/article/details/49382969 多位元組字元與寬位元組字元 char與wchar_t 我們知道C++基本資料型別中表示字元的有兩種:char、wchar_t。  char叫多位