深入理解Java虛擬機器7 晚期(執行期)優化

2021-07-26 20:45:14 字數 1966 閱讀 2570

為了提高熱點**的執行效率,在執行時,虛擬機器將會把這些**編譯成與本地平台相關的機器碼,並進行各種層次的優化,完成這個任務的編譯器稱為即時編譯器,簡稱jit編譯器。注:jit編譯器並非虛擬機器必備的,但卻是體現虛擬機器技術水平的標桿。

1、直譯器與編譯器

直譯器:當程式需要迅速啟動和執行的時候,直譯器可以首先發揮作用,省去編譯的時間,立即執行。

編譯器:編譯執行能提高效率。

即:解釋執行節約記憶體,編譯執行提公升效率。分為:c1、 c2兩種編譯器。

2、c1與c2

c1:將位元組碼編譯成本地**,進行簡單、可靠的優化(區域性優化)。

c2:將位元組碼編譯成本地**,會啟動一些編譯耗時較長的優化,甚至會進行一些不可靠的激進優化。

即:c1(client compiler)可獲得更高的編譯速度,c2(server compiler)可獲得更好的編譯質量。

3、「熱點**」的定位

在執行過程中會被即時編譯器編譯成「熱點**」的有兩類:

a.被多次呼叫的方法;

b.被多次執行的迴圈體( osr:on stack replacement:棧上替換)。

有兩種探測方式判斷「熱點**」:

a.基於取樣的熱點探測

b.基於計數器的熱點探測:hotspot虛擬機器使用此模式。閾值設定:-xx:compilerthreadhold。

4、c2(server compiler)詳解

c2(server compiler)是專門面向伺服器端的典型應用並為伺服器的效能配置特別調整過的編譯器,也是乙個經過充分優化的編譯器。它會執行所有的經典優化動作,如:無用**消除、迴圈展開、消除公共子表示式等等。

5、編譯優化技術詳解

虛擬機器設計團隊幾乎把對**的所有優化措施都集中在了即時編譯器之中;他們設計了很多的優化技術,下面部分舉例說明:

初始**:只是舉例介紹,並非vm真正按照這種方式做的

/**

* * @author zhengchao

*/class b

final int get()

public static void main(string args)

public static void foo(b b)

}

首先進行方法內聯:不在呼叫get方法,直接.value。

class b 

final int get()

public static void main(string args)

public static void foo(b b)

}

再進行冗餘**的消除:z的賦值無需用上述的方式:

class b 

final int get()

public static void main(string args)

public static void foo(b b)

}

繼而進行無用**的消除:

class b 

final int get()

public static void main(string args)

public static void foo(b b)

}

以上僅僅只是舉例方便大家理解優化的思路。下面詳細介紹具體的一些方法。

a、公共子表示式消除:計算過的表示式不再繼續計算,前提計算的兩個數值中途未發生變化。。。。

b、陣列邊界檢查消除、自動裝箱消除、安全點消除、消除反射等等:為了不必要的檢查浪費判斷時間。。。。如下這種優化:

if(b!=null) else
優化後:

try catch(..)

c、方法內聯。。。。

優化的技術還有很多,在此不做一一陳述。

深入理解Java虛擬機器

1.class檔案是一組以8位位元組為基礎單位的二進位製流,各個資料專案嚴格按照順序緊湊地排列在class檔案中,中間沒有新增任何分隔符,這使得整個class檔案中儲存的內容幾乎全部是程式執行的必要資料,沒有空隙存在。當遇上占用8位位元組以上的資料時,按照高位在前的方式分割成若干個8位進行儲存 大端...

深入理解Java虛擬機器 JVM記憶體洩漏

jvm記憶體洩漏 記憶體洩漏就是存在一些物件沒有被 這些物件是可達的,但是這些物件是無用的,那麼這些物件就存在記憶體洩漏,即不會被gc 但是卻占用記憶體。記憶體溢位主要分為以下幾種 1.靜態集合類引起記憶體洩漏 像hashmap vector等的使用最容易出現記憶體洩露,這些靜態變數的生命週期和應用...

《深入理解Java虛擬機器》筆記 類檔案結構

各種不同平台的虛擬機器與所有平台都統一使用的程式儲存格式 位元組碼是構成平台無關性的基石。1.class類檔案的結構 常量池的入口放置一項u2型別的資料。代表常量池容量計數值 constant pool count 常量池主要放兩類常量 字面量和符號引用。字面量如文字字串 宣告為final的常量值等...