Java位元組碼---解釋執行
Java安全性和可移植性的關鍵在於Java編譯器的輸出並不是可執行的程式碼,而是位元組碼(bytecode)。位元組碼是一套在Java執行時系統執行的高度優化的指令集,該Java執行時系統稱為Java虛擬機器(JavaVirtual Machine,JVM)。在其標準形式下,JVM 就是一個位元組碼直譯器。這可能有點讓人吃驚,因為出於對效能的考慮,大多數現代語言都被設計為編譯型,而不是解釋型。然而,正是通過JVM解釋Java程式才有助於解決在Internet上下載程式的主要問題。這就是Java輸出位元組碼的原因。
將一個Java程式翻譯成位元組碼,有助於更容易地在一個大範圍的環境下執行程式。原因非常直接:只要在各種平臺上都實現Java虛擬機器就可以了。在一個給定的系統中,只要系統執行時包存在,任何Java程式就可以在該系統上執行。記住:儘管不同平臺的Java虛擬機器的細節有所不同,但它們都解釋同樣的Java位元組碼。如果一個Java程式被編譯為本機程式碼,那麼對於連線到Internet上的每一種CPU型別,都要有該程式的對應版本。這當然不是一個可行的解決方案。因此,通過JVM執行位元組碼是編寫真正可移植性程式的最容易的方法。
由JVM執行Java程式也有助於提高它的安全性。因為JVM控制Java程式的執行,所以它可以包含這個程式並且能阻止它在系統之外產生負作用。而Java語言某些限制增強了它的安全性。
一般程式被編譯為一種中間形式,然後由虛擬機器解釋執行時,其執行速度比將程式編譯為可執行程式碼來執行要慢。但是對Java來說,這兩者之間的差別不太大。由於已高度優化了位元組碼,所以使用位元組碼能夠使JVM以比想象的快得多的速度執行程式。
儘管Java最初被設計為解釋,但是在技術上Java並不妨礙將位元組碼動態的編譯為本機程式碼。在最初發布Java後不久,SUN公司提供了HotSpot技術。HotSpot有一個位元組碼編譯器——JIT(Just In Time,即時)。JIT是Java虛擬機器的一部分,它根據需要一部分一部分地將所選的位元組碼實時編譯為可執行程式碼。但它不能將整個Java程式一次性全部編譯為可執行的程式碼,因為Java要執行各種執行時檢查,而這些檢查只有在執行時才執行。記住這一點是很重要的,實際上,JIT編譯器只編譯執行時需要的程式碼。另外,JIT並非編譯所有的位元組碼序列,而只是編譯那些以後有用的位元組碼,對剩餘程式碼仍只是進行解釋。儘管如此,這種即時編譯執行的方法仍然使效能得到較大提高。在對位元組碼進行動態編譯後,Java程式的可移植性和安全性仍能得到保證,因為JVM仍然能夠控制Java程式的執行環境。
相關推薦
Java位元組碼---解釋執行
Java安全性和可移植性的關鍵在於Java編譯器的輸出並不是可執行的程式碼,而是位元組碼(bytecode)。位元組碼是一套在Java執行時系統執行的高度優化的指令集,該Java執行時系統稱為Java虛擬機器(JavaVirtual Machine,JVM)。在
java位元組碼的執行過程
下面的一些列舉是校驗器執行的一些檢查: 1)變數要在使用前初始化 2)方法呼叫與物件引用型別之間要匹配 3)訪問私有資料和方法的規則沒有被違反 4)對本地變數的訪問都在執行的堆疊內 5)執行時堆疊沒有溢位 如果這些檢查沒有通過,類不會被載入。下面一段程式碼可以用來測試,先將類匯入
java中i++ ++i位元組碼解釋
先上問題: int i = 0; i = i++; int i = 0; i = ++i; int i = 0; int j = 0; j = i+++i++; int i = 0; int j = 0; j = i+++i+++i++; 運算後i和j的值分別是多少
java代碼中執行liunx命令
number sta stream mod ces linu pla comm shell public static String runShell(String command){ try{ String[] commands = isLinux
【java】之java代碼的執行機制
() alt 分享 str clas not roc 成員 輸入 要在JVM中執行java代碼必須要編譯為class文件,JDK是如何將Java代碼編譯為class文件,這種機制通常被稱為Java源碼編譯機制。 1、JVM定義了class文件的格式,但是並沒有定義如何將ja
JVM理論:(三/3)運行時棧幀結構、基於棧的字節碼解釋執行過程
指向 stat 中一 指令執行過程 字節碼指令 輸出 作用 引擎 jvm 一、棧幀結構 講棧幀結構有必要回顧一下前文Class文件中的Code屬性結構,如下圖。 棧幀是用於支持虛擬機進行方法調用和方法執行的數據結構,它是虛擬機棧的棧元素。每一個方法從調用開始到
Javassist之使用位元組碼在執行時生成新的類 01
介紹 Javassist是一個開源的分析、編輯和建立Java位元組碼的類庫。是由東京工業大學的數學和計算機科學系的 Shigeru Chiba (千葉 滋)所建立的。它已加入了開放原始碼JBoss 應用伺服器專案,通過使用Javassist對位元組碼操作為JBoss實現動態"AOP"框架。
一文讓你明白 Java 位元組碼
前言 也許你寫了無數行的程式碼,也許你能非常溜的使用高階語言,但是你未必瞭解那些高階語言的執行過程。例如大行其道的Java。 Java號稱是一門“一次編譯到處執行”的語言,但是我們對這句話的理解深度又有多少呢?從我們寫的java檔案到通過編譯器編譯成java位元組碼檔案(也就是.class檔案),這個過程
大話+圖說:Java位元組碼指令——只為讓你懂
前言 隨著Java開發技術不斷被推到新的高度,對於Java程式設計師來講越來越需要具備對更深入的基礎性技術的理解,比如Java位元組碼指令。不然,可能很難深入理解一些時下的新框架、新技術,盲目一味追新也會越來越感乏力。 本文既不求照本宣科,亦不求炫技或著文立說,僅力圖以最簡明、最形象生動的方式,結合例子與
java位元組碼-this分析
1.this我們用的非常多,但是沒有搞清楚為啥我們可以在例項方法中使用this。這裡我從java位元組碼的角度來分析this。 2.程式碼: public class Test { private static String hello(String hello){
深入理解java位元組碼
Javap 反編譯class檔案 –verbose 顯示冗餘資訊 (1)魔數:所有的class位元組碼檔案的4個位元組都是魔數,魔數固定值:0xCAFEBABE (2)版本:魔數之後4個位元組是版本資訊,前兩個位元組minor version次版本號例如0,後兩個位元組是主機板號majo
例項分析理解Java位元組碼
Java語言最廣為人知的口號就是“一次編譯到處執行”,這裡的“編譯”指的是編譯器將Java原始碼編譯為Java位元組碼檔案(也就是.class檔案,本文中不做區分),“執行”則指的是Java虛擬機器執行位元組碼檔案。Java的跨平臺得益於不同平臺上不同的JVM的實現,只要提供規範的位元組碼檔案,無論是什麼平臺
Java位元組碼結構剖析二:欄位表
access_flags 訪問標誌資訊包括該class檔案是類還是介面,是否定義成public,是否是abstract,如果是類,是否被申明為final。access_flags 的取值範圍和相應含義見下表。 我們的位元組碼裡該位置的16進製表示是0×0021。0×0021=0×0001 ^ 0×00
從 Java 位元組碼到 ASM 實踐
1. 概述 AOP(面向切面程式設計)的概念現在已經應用的非常廣泛了,下面是從百度百科上摘抄的一段解釋,比較淺顯易懂 在軟體業,AOP為Aspect Oriented Programming的縮寫,意為:面向切面程式設計,通過預編譯方式和執行期動態代理實現程式功能的統一維護的一種技術。AOP是OOP
Java位元組碼結構剖析三:方法表
這裡給大家介紹一款位元組碼分析小工具——jclasslib bytecode viewer。它可以將位元組碼檔案結構化的展現給我們看。 緊接著上篇『欄位表』的分析。後面的分析輪到了『方法表』。 方法表結構 u2 method_count:方法計數器,metho
Java位元組碼結構剖析一:常量池
這篇部落格開始,我打算帶大家去解讀一下JVM平臺下的位元組碼檔案(熟悉而又陌生的感覺)。眾所周知,Class檔案包含了我們定義的類或介面的資訊。然後位元組碼又會被JVM載入到記憶體中,供JVM使用。那麼,類資訊到了位元組碼檔案裡,它們如何表示的,以及在位元組碼裡是怎麼分佈的呢?帶著這些問題,讓我們
Java位元組碼指令收集大全
Java位元組碼指令大全 常量入棧指令 指令碼 操作碼(助記符) 運算元 描述(棧指運算元棧) 0x01 aconst_null
Java位元組碼詳解(三)位元組碼指令(轉)
一、概述 Java虛擬機器採用基於棧的架構,其指令由操作碼和運算元組成。 操作碼:一個位元組長度(0~255),意味著指令集的操作碼個數不能操作256條。 運算元:一條指令可以有零或者多個運算元,且運算元可以是1個或者多個位元組。編譯後的程式碼沒有采用運算元長
一文讓你明白Java位元組碼
也許你寫了無數行的程式碼,也許你能非常溜的使用高階語言,但是你未必瞭解那些高階語言的執行過程。例如大行其道的Java。 Java號稱是一門“一次編譯到處執行”的語言,但是我們對這句話的理解深度又有多少呢?從我們寫的java檔案到通過編譯器編譯成java位元組碼檔案(也就是.
Java位元組碼淺析(—)
英文原文連結,譯文連結,原文作者:James Bloom,譯者:有孚 明白Java程式碼是如何編譯成位元組碼並在JVM上執行的非常重要,這有助於理解程式執行的時候究竟發生了些什麼。理解這點不僅能搞清語言特性是如何實現的,並且在做方案討論的時候能清楚相應的副作用及權衡利弊。 本文介紹了Java程