每日一問:你瞭解 Java 虛擬機器結構麼?

nanchen2251發表於2019-06-13

對於從事 C/C++ 程式設計師開發的小夥伴來說,在記憶體管理領域非常頭疼,因為他們總是需要對每一個 new 操作去寫配對的 delete/free 程式碼。而對於我們 Android 乃至 Java 程式設計師,卻總是會因為虛擬機器的自動記憶體管理機制而忽視記憶體管理的重要性。

經過前面簡短的幾篇純 Android 問題,我想再給大家摻雜一點可能平時你並沒有太多關注的東西。其實寫這個的時候我相當糾結,因為對於大多數 Android 開發來說,他們會更加註重實質性的技能提升,而不是我今天將要講的 Java 虛擬機器結構。

但經過一系列的思想鬥爭,我還是打算把這個講到底,為了不浪費大家太多的時間,我依然遵從「每日一問」系列的初衷,我們儘可能地精簡文字,讓每一個小知識點閱讀時間都控制在 5 分鐘以下。

Java 虛擬機器結構作為一個面試高頻考點,你完全可以當做你在複習面試知識,這樣興許你的學習的心態會好一些。

每日一問:你瞭解 Java 虛擬機器結構麼?

我還是不得不去網上摘下了這個圖,我想唯有用這張圖結合講解起來才更加的通俗易懂。

Java 虛擬機器記憶體區域確實就由這幾部分構成:方法區、虛擬機器棧、本地方法棧、堆、程式計數器。

程式計數器

程式計數器是一個較小的記憶體空間,執行緒私有,它是唯一一個在 Java 虛擬機器規範中沒有規定任何 OOM 情況的區域。

虛擬機器棧

虛擬機器棧和程式計數器一樣,同樣為執行緒所私有,並且生命週期和執行緒相同。。每個棧中的資料都是私有的,其他棧不允許訪問,每個方法被執行的時候都會同時建立一個棧幀,每一個方法被呼叫直至執行完成的過程,就對應著一個棧幀在虛擬機器棧從入棧到出棧的過程。虛擬機器棧主要存放各種編譯期可知的基本資料型別和物件的引用。

本地方法棧

本地方法棧與虛擬機器棧發揮的作用非常相似,其主要區別是虛擬機器棧為虛擬機器執行 Java 方法(也就是位元組碼)服務,而本地房發展則是為虛擬機器用到的 Native 方法服務。

Java 堆

Java 堆是垃圾收集器管理的主要區域,主要用於存放物件的例項,自然而然就成了 Java 虛擬機器中管理記憶體最大的一塊,並且它可以處於物理上不連續的記憶體空間中,Java 堆在虛擬機器啟動的時候就進行建立,並被所有執行緒所共享。

方法區

方法區和 Java 堆一樣,是各個執行緒共享的記憶體區域,主要儲存已被虛擬機器載入的類資訊、常量、靜態變數、即時編譯器編譯後的程式碼等資料。這個區域的記憶體回收目標主要是針對常量池的回收和對型別的寫在,較少發生垃圾收集行為。

上面對 Java 虛擬機器結構進行了非常精簡的講解,大家可還對此清晰了一些?如果還是沒有太透徹其實沒有關係,多回顧幾遍,最好能自己畫一個圖,在一邊進行理解。明天我們再來講一講我們另外一個面試非常高頻的考點:垃圾回收演算法,一起來探究 Java 虛擬機器到底是怎麼來回收一個無用的物件的。

相關文章