JVM啓動流程、類型與模式

啓動流程

        當執行java命令時,程序會去尋找合適的JRE的home位置。

        在JRE/lib/cpu_arch(cpu的架構)/JVM.cfg下找到這個文件。

在JVM.cfg中存在以下的配置信息: 

    -client KNOWN (客戶端模式)

    -server KNOWN(服務端模式)

    -hotspot ALIASED_TO -client(等同於client模式)

    -classic WARN(已經推出歷史舞臺,還有限度支持,將有可能又其它JVM的設置來替代)

    -native ERROR(不支持,報錯)

    -green ERROR (不支持,報錯)

通過文件我們可以定義目前jdk中支持那些JVM,前面部分(client)是JVM名稱,後面是參數。

KNOWN表示JVM存在,

ALIASED_TO表示給別的JVM取一個別名,

WARN表示不存在時找一個JVM替代,

ERROR表示不存在拋出異常。

        如果在運行Java時未指定上面兩種方法中的任一一種參數,那麼會返回第一個定義的jvm。所以可以通過這個文件調整默認jvm類型。

        確定jvm類型後就可以基於LoadLibrary來加載dll文件,完成JVM的創建準備工作。

          裝載完JVM環境之後,需要對啓動參數進行解析。

        加載jvm.dll後就可以使用裏面的函數,調用InvocationFunctions->CreateJavaVM

也就是JVM中JNI_CreateJavaVM方法獲得JNIEnv結構的實例

        JVM初始化結束之後,在啓動通過findClass等操作加載Main入口類,調用main方法執行Java程序的後續操作


JVM類型

   jvm常用兩種類型client、server關於兩種類型jvm的區別,官方給出的解釋:

   這兩個系統是不同的二進制文件。 它們基本上是兩個不同的編譯器(JIT),它們連接到同一個運行時系統。 客戶端系統對於需要快速啓動時間或佔用空間較小的應用程序是最佳的,服務器系統對於總體性能最重要的應用程序是最佳的。 通常,客戶端系統更適合於諸如GUI的交互式應用。 一些其他差異包括編譯策略,堆默認值和內聯策略。

        

根據《The Java HotSpot Performance Engine Architecture》:

The Client VM compiler does not try to execute many of the more complex optimizations performed by the compiler in the Server VM, but in exchange, it requires less time to analyze and compile a piece of code. This means the Client VM can start up faster and requires a smaller memory footprint.

Note: It seems that the main cause of the difference in performance is the amount of optimizations.

The Server VM contains an advanced adaptive compiler that supports many of the same types of optimizations performed by optimizing C++ compilers, as well as some optimizations that cannot be done by traditional compilers, such as aggressive inlining across virtual method invocations. This is a competitive and performance advantage over static compilers. Adaptive optimization technology is very flexible in its approach, and typically outperforms even advanced static analysis and compilation techniques.

Both solutions deliver extremely reliable, secure, and maintainable environments to meet the demands of today’s enterprise customers.

很明顯,Client VM的編譯器沒有像Server VM一樣執行許多複雜的優化算法,因此,它在分析和編譯代碼片段的時候更快。而Server VM則包含了一個高級的編譯器,該編譯器支持許多和在C++編譯器上執行的一樣的優化,同時還包括許多傳統的編譯器無法實現的優化。

jvm類型切換

打開JVM.cfg可以看到配置的一些jvm類型通過調整client、server的順序可以改變默認的jvm類型。默認是client。這個修改是全局生效的,下一次啓動也會應用這個配置,當然,如果你不想全局改動,也可以按照在java命令後加上-server或者-client來明確指定本次java命令需要JVM使用何種模式來工作。


JVM的工作模式


JVM有以下幾種模式:-Xint, -Xcomp, 和 -Xmixed

        -Xint代表解釋模式(interpreted mode),-Xint標記會強制JVM以解釋方式執行所有的字節碼,當然這會降低運行速度,通常低10倍或更多

        -Xcomp代表編譯模式(compiled mode),與它(-Xint)正好相反,JVM在第一次使用時會把所有的字節碼編譯成本地代碼,從而帶來最大程度的優化。

        -Xmixed代表混合模式(mixed mode),前面也提到了,混合模式是JVM的默認工作模式。它會同時使用編譯模式和解釋模式。對於字節碼中多次被調用的部分,JVM會將其編譯成本地代碼以提高執行效率;而被調用很少(甚至只有一次)的方法在解釋模式下會繼續執行,從而減少編譯和優化成本。


切換JVM的工作模式

和切換JVM的類型一樣,我們可以在命令行裏顯示指定使用JVM的何種模式,比如:wKiom1hsXYvDAQ6AAAAfxSUo6fk038.png-wh_50



發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章