JVM學習筆記-01

JVM

一、JVM是什麼

JVM:Java virtual Machine,Java虛擬機,是java平臺的一部分,能夠運行Java的字節碼文件(bytecode),包含JRE(Java運行時環境)和JDK(Java開發工具包),也是Java實現跨平臺的基礎,不同的操作系統都有對應版本的JVM,來執行字節碼文件,從而實現Java的跨平臺。

主流JVM有,JRockit VM,HotSpot VM和J9 VM,我們現在用到的,一般都是HotSpot VM,如上圖。

二、字節碼的執行過程

1.由以【.java】結尾的Java源文件通過JDK中的編譯工具【Javac】編譯生成以【.class】結尾的字節碼文件
2.將字節碼文件解釋爲010100110....的二進制文件,交給操作系統執行,將字節碼文件翻譯成機器碼執行時提供了兩種方式
   a.JIT(Just-In-Time)編譯執行器:負責即時編譯執行,編譯後的編譯結果會保存在緩存區,以提高性能。
   b.解釋執行器:負責逐條將字節碼翻譯成機器碼並執行。

【PS】JVM中,解釋執行與編譯執行並存,解釋器與編譯器兩者各有優勢,當程序需要迅速啓動和執行時,解釋器可以首先發揮作用,省去編譯的時間,立即執行,在程序運行後,即時編譯器逐漸發揮作用,它可以對反覆執行緩存後的熱點代碼,以獲取更高的執行效率。但由於緩存的指令是有限的,如果每條代碼都進行編譯,緩存,會增加系統開銷,所以,當程序運行環境中的內存資源限制較大時,可以使用解釋器執行節約內存,反之可以使用編譯執行來提升效率。

   【Javap -c】指令可以將字節碼文件反編譯出當前類對應的機器碼,感興趣的也可以看一下,但是好像對工作用處不大,此處自行腦部捂臉的表情。部分指令介紹:
    const系列:將指定數據進行壓棧,如iconst_1,將int類型的局部變量1壓入棧頂
    store系列:將指定數據存入本地變量,如istore_3,將int類型的局部變量3存入本地變量
    load系列:將指定數據的索引推至棧頂,如iaload,將int類型的數組的索引推至棧頂
    運算符系列:isub 相減  imul相乘  idiv相除  irem取模等
    自增自減指令:iinr,如iinr2,1,第三個整形變量自增1

三、JVM的作用

1.可以通過修改堆內存的大小有效防止內存泄漏和內存溢出。
2.優化線程鎖的使用,JDK1.8以後對synchronized鎖進行了調整,輕量級鎖,重量級鎖和自旋鎖等。
3.通過調整棧內存的大小來提高系統的吞吐量。
4.通過調整新生代老年代的小大,降低延遲,提高系統性能。

四、JVM的組成

運行數據區
       堆:存放系統運行過程中產生的各種對象。
       棧:包括線程棧和本地方法棧,各個線程在執行時會開闢獨立的內存空間。
       方法區:靜態變量,常量,字節碼文件,JDK1.8以後使用的是物理內存。
       程序計數器:存儲每個線程執行的位置,通過執行引擎修改程序執行的位置標記。

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