面試靈魂拷問:對你 JVM 的運行原理了解多少?

作者簡介:李國 曾任京東金融、陌陌科技高級架構師。本文選自拉勾教育專欄:《深入淺出 Java 虛擬機》

你好,我是李國,今天要給大家分享的是 JVM 的學習。如果你是一名軟件開發工程師,在日常工作中除了 Java 這個關鍵詞外,還有一個名詞也一定經常被提及,那就是 JVM 。提到 JVM 我們經常會在面試中遇到這樣的問題

  • 為什麼 Java 研發系統需要 JVM?
  • 對你 JVM 的運行原理了解多少?
  • 我們寫的 Java 代碼到底是如何運行起來的?

想要弄清楚這些問題,我們接下來從這三個維度去探討:

  • JVM 和操作系統的關係?
  • JVM、JRE 、JDK的關係?
  • JVM 虛擬機規範和 Java 語言規範的關係?

本文選自拉勾教育專欄:《深入淺出 Java 虛擬機》見文末了解更多

JVM 和操作系統的關係

面試靈魂拷問:對你 JVM 的運行原理了解多少?

我們用一句話概括 JVM 與操作系統之間的關係:JVM 上承開發語言,下接操作系統,它的中間接口就是字節碼。

而 Java 程序和我們通常使用的 C++ 程序有什麼不同呢?這裡用兩張圖進行說明。

面試靈魂拷問:對你 JVM 的運行原理了解多少?

面試靈魂拷問:對你 JVM 的運行原理了解多少?

對比這兩張圖可以看到 C++ 程序是編譯成操作系統能夠識別的 .exe 文件,而 Java 程序是編譯成 JVM 能夠識別的 .class 文件,然後由 JVM 負責調用系統函數執行程序。

本文選自拉勾教育專欄:《深入淺出 Java 虛擬機》見文末了解更多

JVM、JRE、JDK的關係

面試靈魂拷問:對你 JVM 的運行原理了解多少?

通過上面的學習我們瞭解到 JVM 是 Java 程序能夠運行的核心。但是需要注意,JVM 自己什麼也幹不了,你需要給它提供生產原料(.class 文件)。俗語說的好,巧婦難為無米之炊。它雖然功能強大,但仍需要為它提供 .class 文件。

僅僅是 JVM,是無法完成一次編譯,處處運行的。它需要一個基本的類庫,比如怎麼操作文件、怎麼連接網絡等。而 Java 體系很慷慨,會一次性將 JVM 運行所需的類庫都傳遞給它。JVM 標準加上實現的一大堆基礎類庫,就組成了 Java 的運行時環境,也就是我們常說的 JRE(Java Runtime Environment)。

有了 JRE 之後,我們的 Java 程序便可以在瀏覽器中運行了。大家可以看一下自己安裝的 Java 目錄,如果是隻需要執行一些 Java 程序,只需要一個 JRE 就足夠了。

對於 JDK 來說,就更龐大了一些。除了 JRE,JDK 還提供了一些非常好用的小工具,比如 javac、java、jar 等。它是 Java 開發的核心,讓外行也可以煉劍!

我們也可以看下 JDK 的全拼,Java Development Kit 。我非常怕 kit(裝備)這個單詞,它就像一個無底洞,預示著你永無休止的對它進行研究。JVM、JRE、JDK 它們三者之間的關係,可以用一個包含關係表示。

JDK>JRE>JVM

面試靈魂拷問:對你 JVM 的運行原理了解多少?

JVM 虛擬機規範和 Java 語言規範的關係

我們通常談到 JVM ,首先會想到它的垃圾回收器,其實它還有很多部分,比如對字節碼進行解析的執行引擎等。廣義上來講,JVM 是一種規範,它是最為官方、最為準確的文檔;狹義上來講,由於我們使用 Hotspot 更多一些,我們一般在談到這個概念時,會將它們等同起來

如果再加上我們平常使用的 Java 語言的話,可以得出下面這樣一張圖。這是 Java 開發人員必須要搞懂的兩個規範。

面試靈魂拷問:對你 JVM 的運行原理了解多少?

左半部分是 Java 虛擬機規範,其實就是為輸入和執行字節碼提供一個運行環境。右半部分是我們常說的 Java 語法規範,比如 switch、for、泛型、lambda 等相關的程序,最終都會編譯成字節碼。而連接左右兩部分的橋樑依然是 Java 的字節碼。

如果 .class 文件的規格是不變的,這兩部分是可以獨立進行優化的。但 Java 也會偶爾擴充一下 .class 文件的格式,增加一些字節碼指令,以便支持更多的特性。

我們可以把 Java 虛擬機可以看作是一臺抽象的計算機,它有自己的指令集以及各種運行時內存區域,學過《計算機組成結構》的同學會在課程的後面看到非常多的相似性。

那有的同學就說了,我不學習 JVM ,會影響我寫 Java 代碼麼?理論上,這兩者沒有什麼必然的聯繫。它們之間通過 .class 文件進行交互,即使你不瞭解 JVM,也能夠寫大多數的 Java 代碼。就像是你寫 C++ 代碼一樣,並不需要特別深入的瞭解操作系統的底層是如何實現的。

但是,如果你想要寫一些比較精巧、效率比較高的代碼,就需要了解一些執行層面的知識了。瞭解 JVM,主要用在調優以及故障排查上面,你會對運行中的各種資源分配,有一個比較全面的掌控。

小結

搞懂這些,我們再回頭看上面的三個問題,自然迎刃而解了。

  • 為什麼 Java 研發系統需要 JVM?

JVM 解釋的是類似於彙編語言的字節碼,需要一個抽象的運行時環境。同時,這個虛擬環境也需要解決字節碼加載、自動垃圾回收、併發等一系列問題。JVM 其實是一個規範,定義了 .class 文件的結構、加載機制、數據存儲、運行時棧等諸多內容,最常用的 JVM 實現就是Hotspot。

  • 對你 JVM 的運行原理了解多少?

JVM 的生命週期是和 Java 程序的運行一樣的,當程序運行結束,JVM 實例也跟著消失了。JVM 處於整個體系中的核心位置,關於其具體運行原理,我們在下面的分享中詳細介紹。

  • 我們寫的 Java 代碼到底是如何運行起來的?
  • 一個 Java 程序,首先經過 javac 編譯成 .class 文件,然後 JVM 將其加載到`元數據`區,執行引擎將會通過`混合模式`執行這些字節碼。執行時,會翻譯成操作系統相關的函數。JVM 作為 .class 文件的黑盒存在,輸入字節碼,調用操作系統函數。過程如下:Java 文件->編譯器>字節碼->JVM->機器碼

    總結

    到這裡本次分享的內容就全部講完了,今天我們分別從三個角度,瞭解了 JVM 在 Java 研發體系中的位置

    下一次分享我將分享關於 JVM 內存管理相關的知識,記得持續關注 IT 技術思維哦。

    查看後續內容:拉勾教育專欄《深入淺出 Java 虛擬機》見文末了解更多


    分享到:


    相關文章: