1. 程式人生 > 程式設計 >Java 程式內部是如何執行的?

Java 程式內部是如何執行的?

我們日常的工作中都使用開發工具(IntelliJ IDEA 或 Eclipse 等)可以很方便的除錯程式,或者是通過打包工具把專案打包成 jar 包或者 war 包,放入 Tomcat 等 Web 容器中就可以正常運行了,但你有沒有想過 Java 程式內部是如何執行的?

其實不論是在開發工具中執行還是在 Tomcat 中執行,Java 程式的執行流程基本都是相同的,它的執行流程如下:

  • 先把 Java 程式碼編譯成位元組碼,也就是把 .java 型別的檔案編譯成 .class 型別的檔案。這個過程的大致執行流程:Java 原始碼 -> 詞法分析器 -> 語法分析器 -> 語義分析器 -> 位元組碼生成器 -> 最終生成位元組碼,其中任何一個節點執行失敗就會造成編譯失敗;
  • 把 class 檔案放置到 Java 虛擬機器,這個虛擬機器通常指的是 Oracle 官方自帶的 Hotspot JVM;
  • Java 虛擬機器使用類載入器(Class Loader)裝載 class 檔案;
  • 類載入完成之後,會進行位元組碼校驗,位元組碼校驗通過之後 JVM 直譯器會把位元組碼翻譯成機器碼交由作業系統執行。但不是所有程式碼都是解釋執行的,JVM 對此做了優化,比如,以 Hotspot 虛擬機器來說,它本身提供了 JIT(Just In Time)也就是我們通常所說的動態編譯器,它能夠在執行時將熱點程式碼編譯為機器碼,這個時候位元組碼就變成了編譯執行。

Java 程式內部是如何執行的?

Java 虛擬機器是如何判定熱點程式碼的?

Java 虛擬機器判定熱點程式碼的方式有兩種:

  • 基於取樣的熱點判定

主要是虛擬機器會週期性的檢查各個執行緒的棧頂,若某個或某些方法經常出現在棧頂,那這個方法就是“熱點方法”。這種判定方式的優點是實現簡單;缺點是很難精確一個方法的熱度,容易受到執行緒阻塞或外界因素的影響。

  • 基於計數器的熱點判定

主要就是虛擬機器給每一個方法甚至程式碼塊建立了一個計數器,統計方法的執行次數,超過一定的閥值則標記為此方法為熱點方法。

Hotspot 虛擬機器使用的基於計數器的熱點探測方法。它使用了兩類計數器:方法呼叫計數器和回邊計數器,當到達一定的閥值是就會觸發 JIT 編譯。

方法呼叫計數器:在 client 模式下的閥值是 1500 次,Server 是 10000 次,可以通過虛擬機器引數:-XX:CompileThreshold=N

對其進行設定。但是JVM還存在熱度衰減,時間段內呼叫方法的次數較少,計數器就減小。

回邊計數器:主要統計的是方法中迴圈體程式碼執行的次數。

總結

到此這篇關於Java 程式內部是如何執行的?的文章就介紹到這了,更多相關java程式的執行內容請搜尋我們以前的文章或繼續瀏覽下面的相關文章希望大家以後多多支援我們!