2016
Apr
05

Java Virtual Machine 在執行一段時間後,它的 Preformance 會變得越來越好,原因是 JVM 必須先暖機,但是為什麼要先暖機呢,一開始就先暖好不行嗎?

Java 的程式是必須先被編輯器 compile 成 bytecode,而 bytecode 只有 JVM 讀得懂,所以也只能用 Java 來執>行,而Java 為了提升效能,使用了 JIT Compilter ,目的是將那些常常被執行的 methods , compile 成 Native Machine code,這樣程式執行起來就為跟 C/C++ 一樣快。

JVM 只針對整個 method 來做優化,並不會單獨優化某一個程式區塊

再來還有個問題必須了解,JVM 到底是如何定義哪些 method 為常常被執行呢? JVM 預設會將執行超過 1500 次的 method ,認定為必預優化的 method ,而將這些 method compile 成 Native Machine code。

1500 這個數字是可以改的,如果你覺得 1500 這個數字太大或太小,那麼你可以用 -XX:CompileThreshold=xxx 來修改這個數值,例如下面這個 Java 執行語法。

java -XX:CompileThreshold=200 main

如果你寫一段簡單的 Java 程式來測試 java -XX:CompileThreshold=1 main java main 這兩種 java 執行方式,你會發現第一種會花更多的時間,原因是我們強迫只要 method 第一次被執行,就立刻做優化,也因為優化的關系,所以比第二個指令要多花一點時間。

JIT Compilation

再來更深入了解 Java JIT 的運作方式,當某一個 Method 被執行後,JIT 就會記錄這個 Method 被執行一次,直到它累積到 1500 次,這時 JIT 會對這個 method 進行第一次 compile,並將這個 method 的執行次數歸零,在這個階段,程式的執行效率就已經非常好了,但是當這個 method 再次的被執行了 1500 次之後, Java JIT 會對這個 method 做第二次的 compile,再次對 method 進化優化,使其效能更佳。


回應 (Leave a comment)