1. 程式人生 > >Java面試之Java是解釋執行的嗎?

Java面試之Java是解釋執行的嗎?

一、個人觀點

   這個說法不夠準確,Java原始碼首先通過Javac編譯成相應的位元組碼(bytecode),然後,在執行時,通過JVM內嵌的直譯器將位元組碼轉換為最終的機器碼,然後進行執行,這部分是解釋執行。但是常見的JVM(比如Hotspot JVM)提供了JIT(Just-In-Time  動態編譯器),JIT能夠在執行時將熱點程式碼編譯成機器碼,這部分熱點程式碼就屬於編譯執行的。故,總體上說,現在的Java是"解釋+編譯”執行的。

 

二、判斷一段程式碼是否是熱點程式碼的方式:
①基於取樣的熱點探測。
②基於計數器的熱點探測:採用這種方法的虛擬機器會為每個方法建立計數器,統計方法的執行次數,如果執行次數超過一定的閾值就認為它是熱點方法。方法呼叫計數器統計的並不是方法被呼叫的絕對次數,而是一個相對的執行頻率,也就是一段時間內方法被呼叫的次數。當超過一定的時間限度,如果方法的呼叫次數仍然不足以讓它提交給即時編譯器編譯(JIT

編譯當某段程式碼即將第一次被執行時進行編譯),那這個方法的呼叫計數器就會被減少一半,這個過程稱為方法呼叫計數器的熱度的衰減,而這段時間就成為此方法統計的半衰週期,進行熱度衰減的動作在虛擬機器進行垃圾收集時順便進行了。

注意:

        ①JIT編譯(即時編譯)是動態編譯的一個特例。

        ②動態編譯:在執行時編譯。

        ③自適應動態編譯:先讓程式以某種方式執行起來,然後收集一些資訊之後再進行動態編譯。


三、判斷一段迴圈體程式碼是否為熱點程式碼的方式:
①使用回邊計數器計數。

    作用:統計一個方法體重迴圈體程式碼執行的次數,在位元組碼中遇到控制流向後跳轉的指令成為回邊,顯然,建立回邊計數器統計的目的就是為了觸發OSR編譯。沒有計數熱度衰減的過程,因此這個計數器統計的就是該方法執行迴圈的絕對次數,當計數器溢位的時候,它還會把方法計數器的值也調整到溢位的狀態,這樣下次在再進入該方法的時候就會執行標準編譯過程。