1. 程式人生 > >知識點1-JVM的認識

知識點1-JVM的認識

1、JVM在JDK中的位置

JDK其中有一部分是JRE,JRE是JAVA執行環境

JVM是JRE最核心的部分

JVM四大部分:ClassLoader、Runtime Data Area、Execution Engine、Native Interface

JVM大致結構的圖:

    1. ClassLoader是負責載入class檔案,class檔案在檔案開頭有特定的檔案標識,並且ClassLoader只負責class檔案的載入,至於它是否可以執行,則由Execution Engine決定
    2. Native Interface是負責呼叫本地介面的。他的作用是呼叫不同語言的介面給JAVA用,他會在Native Method Stack中記錄對應的本地方法,然後呼叫該方法時就通過Execution Engine載入對應的本地Lib。原本多於用一些專業領域,如JAVA驅動,地圖製作引擎等,現在關於這種本地方法介面的呼叫已經被類似於Socket通訊,WebService等方式取代。
    3. Execution Engine是執行引擎,也叫Interpreter。Class檔案被載入後,會把指令和資料資訊放入記憶體中,Execution Engine則負責把這些命令解釋給作業系統。
    4. Runtime Data Area則是存放資料的,分為五部分:Stack,Heap,Method Area,PC Register,Native Method Stack.幾乎所有的關於java記憶體方面的問題,都是集中在這塊。
    5. Run-time Data Areas如下圖:
    6. Heap是用來存放物件資訊的,和Stack不同,Stack代表著一種執行時的狀態。棧是執行時單位,解決程式該如何執行的問題,而堆是儲存的單位,解決資料儲存的問題。Heap是伴隨著JVM的啟動而建立,負責儲存所有物件例項和陣列的。堆的儲存空間和棧一樣是不需要連續的,它分為Young Generation和Old Generation兩大部分。
    7. PC Register是程式計數暫存器,每個JAVA執行緒都有一個單獨的PC Register,他是一個指標,由Execution Engine讀取下一條指令。如果該執行緒正在執行java方法,則PC Register儲存的是正在被執行的指令的地址,如果是本地方法,PC Register的值沒有定義。
  1. JVM執行原理

Java程式被javac工具編譯為.class位元組碼檔案之後,我們執行java命令,.class檔案被JVM中的Class Loader載入,可以看出JVM的啟動是通過JAVAPAth下的java.exe或者java進行。

呼叫作業系統API判斷系統的CPU架構,根據對應的CPU型別尋找位於JRE目錄下的/lib/jvm.cfg檔案,然後通過該配置檔案找到對應的jvm.dll檔案,初始化jvm.dll並且掛接到JNIENV結構的例項上。

JVM管理並且分配對應的記憶體來執行程式,同時管理垃圾回收。知道程式結束,一種情況是JVM的所有非守護執行緒停止,一種情況是程式呼叫System.exit().JVM的生命週期也結束。

  1. JVM的記憶體管理和垃圾回收
    1. JVM中的記憶體管理主要是指JVM對於Heap的管理,因為Stack、PCRegister和Native Method Stack都是和執行緒一樣的生命週期,線上程結束時自然可以被再次使用。
      1. 棧的管理

JVM允許棧的大小固定或者動態變化的,我們一般通過減少常量,引數的個數來減少棧的增長,在程式設計時,我們把一些常量定義到一個物件中,然後倆引用他們可以體現這一點。少用遞迴呼叫也可以減少棧的佔用。棧不需要垃圾回收的,儘管說垃圾回收是java記憶體管理的一個很熱的話題,棧中的物件如果用垃圾回收的觀點來看,他永遠是live狀態,不需要回收

        1. 棧超過允許大小,會丟擲StackOverflowError
        2. 當Java棧試圖擴充套件時,沒有足夠的儲存器來實現擴充套件,JVM會報OutOfMemoryError
    1. 垃圾回收

JVM中會在以下情況除法回收:物件沒有被引用,作用域發生為捕捉異常

垃圾回收的三種演算法:標記清除演算法、複製演算法、標記整理演算法+

垃圾回收器:Serial GC、ParNew GC、Parrallel Scavenge GC、ParallelOld、Serial Old、CMS

GarbageFirst

  1. JVM的資料型別

JVM自己定義了一個抽象的儲存資料單元,叫做Word,一個字足夠大以持有byte、char、short、int、float、reference或者returnAdress的一個值,兩個字則足夠持有更大的型別long、double。它通常是主機平臺一個指標的大小,如32位的平臺上,字是32位。

JVM是一個非常優秀的JAVA程式