JVM學習總結

一個猿子發表於2020-11-01

JVM學習總結——基本概述

前言

最近在 b 站上看了宋紅康老師的 JVM 講解視訊,對 JVM 有了一個基本特此寫一些部落格來記錄我的一些理解和總結,部落格中所使用的部分圖片是由宋紅康老師畫,我這裡拿來使用一下,特此說明。

什麼是 JVM

學習一樣新的技術,我認為首先我們應該要先要了解他是什麼,有什麼用

JVM 是 Java Virtual Machine(Java虛擬機器)的縮寫,是用來幫助執行 java程式碼的,一開始學習 java 的時候,我就感到疑惑,為什麼使用 java 這門語言我們需要專門的去下一些 配件——JDK,並且還要配置環境變數,不能像 C 語言/ C++ 那種直接寫完程式碼就可以在命令視窗執行了,有一部分原因就是在於 JVM 。

原始碼執行流程

首先,使用 JAVA 編寫的程式碼,我們的計算機是不能直接識別的,使用 JAVA 編寫的程式碼經過編譯器編譯後會生成一個位元組碼檔案,也就是我們使用 javac 命令對 .java 檔案編譯生成那個 class 檔案——位元組碼檔案,但是這個位元組碼檔案我們的計算機也是不能直接識別的,需要通過使用 JVM 進行一系列的處理,最終轉換成作業系統可以執行的機器碼檔案。

exception error

在 JVM 將位元組碼檔案轉換成作業系統可讀的懂的檔案的過程中,我們可以進行的許多操作,這樣的操作就叫做 JVM 優化,之所以需要對 JVM 進行優化是因為,在編寫 JAVA 程式程式碼過程中,我們可能會遇到很多 BUG,其中有些 BUG 在 JAVA 中稱為 Exception,有些 BUG 被稱為 Error,雖然在 oracle 的官方文件中我們可以看到,這兩個類是繼承與同一個父類的,但是觸發這兩種 BUG 的方式卻不同,Exception 通常是我們程式碼中寫的一些錯誤,可能導致空指標,除零異常等一系列的 Exception,但有些錯誤我們是光看程式碼是看不出來的,比如 StackOverFlowError,堆溢位這個 Error 就可能不會被顯示在程式碼中出現,有可能是在 JVM 中 設定的堆的大小不太夠或者其他一些原因,這種 BUG 就需要我們學習完 JVM 後才可以很好的處理。

JVM的具體組成部分

jvm整體架構

圖片來自宋紅康老師

從圖中我們可以看到,JVM具體由一下幾個部分組成:

  • 類載入子系統
  • 執行時資料區
  • 執行引擎
  • 本地方法介面

然而執行時資料區又是由五部分組成的

  • 方法區
  • 程式計數器
  • 本地方法棧
  • 虛擬機器棧

其中需要知道的是,方法區和堆是執行緒共享的,這裡就會涉及到執行緒安全的問題,至於為什麼是執行緒共享的在後面部落格會有說明,而程式計數器和虛擬機器棧以及本地方法棧是執行緒私有的。

這就是我對 JVM 的基本概述,有錯誤的地方歡迎指標。

加油,打工人!