對于從事 C/C++ 程序員開發(fā)的小伙伴來說轿偎,在內(nèi)存管理領(lǐng)域非常頭疼,因為他們總是需要對每一個 new
操作去寫配對的 delete/free
代碼被廓。而對于我們 Android 乃至 Java 程序員坏晦,卻總是會因為虛擬機的自動內(nèi)存管理機制而忽視內(nèi)存管理的重要性。
經(jīng)過前面簡短的幾篇純 Android 問題,我想再給大家摻雜一點可能平時你并沒有太多關(guān)注的東西昆婿。其實寫這個的時候我相當(dāng)糾結(jié)球碉,因為對于大多數(shù) Android 開發(fā)來說,他們會更加注重實質(zhì)性的技能提升仓蛆,而不是我今天將要講的 Java 虛擬機結(jié)構(gòu)睁冬。
但經(jīng)過一系列的思想斗爭,我還是打算把這個講到底多律,為了不浪費大家太多的時間痴突,我依然遵從「每日一問」系列的初衷,我們盡可能地精簡文字狼荞,讓每一個小知識點閱讀時間都控制在 5 分鐘以下。
Java 虛擬機結(jié)構(gòu)作為一個面試高頻考點帮碰,你完全可以當(dāng)做你在復(fù)習(xí)面試知識相味,這樣興許你的學(xué)習(xí)的心態(tài)會好一些。
我還是不得不去網(wǎng)上摘下了這個圖殉挽,我想唯有用這張圖結(jié)合講解起來才更加的通俗易懂丰涉。
Java 虛擬機內(nèi)存區(qū)域確實就由這幾部分構(gòu)成:方法區(qū)、虛擬機棧斯碌、本地方法棧一死、堆、程序計數(shù)器傻唾。
程序計數(shù)器
程序計數(shù)器是一個較小的內(nèi)存空間投慈,線程私有,它是唯一一個在 Java 虛擬機規(guī)范中沒有規(guī)定任何 OOM 情況的區(qū)域冠骄。
虛擬機棧
虛擬機棧和程序計數(shù)器一樣伪煤,同樣為線程所私有,并且生命周期和線程相同凛辣。抱既。每個棧中的數(shù)據(jù)都是私有的,其他棧不允許訪問扁誓,每個方法被執(zhí)行的時候都會同時創(chuàng)建一個棧幀防泵,每一個方法被調(diào)用直至執(zhí)行完成的過程,就對應(yīng)著一個棧幀在虛擬機棧從入棧到出棧的過程蝗敢。虛擬機棧主要存放各種編譯期可知的基本數(shù)據(jù)類型和對象的引用捷泞。
本地方法棧
本地方法棧與虛擬機棧發(fā)揮的作用非常相似,其主要區(qū)別是虛擬機棧為虛擬機執(zhí)行 Java 方法(也就是字節(jié)碼)服務(wù)前普,而本地房發(fā)展則是為虛擬機用到的 Native 方法服務(wù)肚邢。
Java 堆
Java 堆是垃圾收集器管理的主要區(qū)域,主要用于存放對象的實例,自然而然就成了 Java 虛擬機中管理內(nèi)存最大的一塊骡湖,并且它可以處于物理上不連續(xù)的內(nèi)存空間中贱纠,Java 堆在虛擬機啟動的時候就進行創(chuàng)建,并被所有線程所共享响蕴。
方法區(qū)
方法區(qū)和 Java 堆一樣谆焊,是各個線程共享的內(nèi)存區(qū)域,主要存儲已被虛擬機加載的類信息浦夷、常量辖试、靜態(tài)變量、即時編譯器編譯后的代碼等數(shù)據(jù)劈狐。這個區(qū)域的內(nèi)存回收目標(biāo)主要是針對常量池的回收和對類型的寫在罐孝,較少發(fā)生垃圾收集行為。
上面對 Java 虛擬機結(jié)構(gòu)進行了非常精簡的講解肥缔,大家可還對此清晰了一些莲兢?如果還是沒有太透徹其實沒有關(guān)系,多回顧幾遍续膳,最好能自己畫一個圖改艇,在一邊進行理解。明天我們再來講一講我們另外一個面試非常高頻的考點:垃圾回收算法坟岔,一起來探究 Java 虛擬機到底是怎么來回收一個無用的對象的谒兄。