對於從事 C/C++ 程序員開發的小夥伴來講,在內存管理領域很是頭疼,由於他們老是須要對每個 new
操做去寫配對的 delete/free
代碼。而對於咱們 Android 乃至 Java 程序員,卻老是會由於虛擬機的自動內存管理機制而忽視內存管理的重要性。程序員
通過前面簡短的幾篇純 Android 問題,我想再給你們摻雜一點可能平時你並無太多關注的東西。其實寫這個的時候我至關糾結,由於對於大多數 Android 開發來講,他們會更加註重實質性的技能提高,而不是我今天將要講的 Java 虛擬機結構。面試
但通過一系列的思想鬥爭,我仍是打算把這個講到底,爲了避免浪費你們太多的時間,我依然聽從「每日一問」系列的初衷,咱們儘量地精簡文字,讓每個小知識點閱讀時間都控制在 5 分鐘如下。算法
Java 虛擬機結構做爲一個面試高頻考點,你徹底能夠當作你在複習面試知識,這樣興許你的學習的心態會好一些。學習
我仍是不得不去網上摘下了這個圖,我想惟有用這張圖結合講解起來才更加的通俗易懂。線程
Java 虛擬機內存區域確實就由這幾部分構成:方法區、虛擬機棧、本地方法棧、堆、程序計數器。3d
程序計數器是一個較小的內存空間,線程私有,它是惟一一個在 Java 虛擬機規範中沒有規定任何 OOM 狀況的區域。code
虛擬機棧和程序計數器同樣,一樣爲線程所私有,而且生命週期和線程相同。。每一個棧中的數據都是私有的,其餘棧不容許訪問,每一個方法被執行的時候都會同時建立一個棧幀,每個方法被調用直至執行完成的過程,就對應着一個棧幀在虛擬機棧從入棧到出棧的過程。虛擬機棧主要存放各類編譯期可知的基本數據類型和對象的引用。cdn
本地方法棧與虛擬機棧發揮的做用很是類似,其主要區別是虛擬機棧爲虛擬機執行 Java 方法(也就是字節碼)服務,而本地房發展則是爲虛擬機用到的 Native 方法服務。對象
Java 堆是垃圾收集器管理的主要區域,主要用於存放對象的實例,天然而然就成了 Java 虛擬機中管理內存最大的一塊,而且它能夠處於物理上不連續的內存空間中,Java 堆在虛擬機啓動的時候就進行建立,並被全部線程所共享。blog
方法區和 Java 堆同樣,是各個線程共享的內存區域,主要存儲已被虛擬機加載的類信息、常量、靜態變量、即時編譯器編譯後的代碼等數據。這個區域的內存回收目標主要是針對常量池的回收和對類型的寫在,較少發生垃圾收集行爲。
上面對 Java 虛擬機結構進行了很是精簡的講解,你們可還對此清晰了一些?若是仍是沒有太透徹其實沒有關係,多回顧幾遍,最好能本身畫一個圖,在一邊進行理解。明天咱們再來說一講咱們另一個面試很是高頻的考點:垃圾回收算法,一塊兒來探究 Java 虛擬機究竟是怎麼來回收一個無用的對象的。