每日一问:你了解 Java 虚拟机结构么?
對于從事 C/C++ 程序員開發(fā)的小伙伴來說,在內(nèi)存管理領(lǐng)域非常頭疼,因?yàn)樗麄兛偸切枰獙γ恳粋€(gè) new 操作去寫配對的 delete/free 代碼。而對于我們 Android 乃至 Java 程序員,卻總是會因?yàn)樘摂M機(jī)的自動(dòng)內(nèi)存管理機(jī)制而忽視內(nèi)存管理的重要性。
經(jīng)過前面簡短的幾篇純 Android 問題,我想再給大家摻雜一點(diǎn)可能平時(shí)你并沒有太多關(guān)注的東西。其實(shí)寫這個(gè)的時(shí)候我相當(dāng)糾結(jié),因?yàn)閷τ诖蠖鄶?shù) Android 開發(fā)來說,他們會更加注重實(shí)質(zhì)性的技能提升,而不是我今天將要講的 Java 虛擬機(jī)結(jié)構(gòu)。
但經(jīng)過一系列的思想斗爭,我還是打算把這個(gè)講到底,為了不浪費(fèi)大家太多的時(shí)間,我依然遵從「每日一問」系列的初衷,我們盡可能地精簡文字,讓每一個(gè)小知識點(diǎn)閱讀時(shí)間都控制在 5 分鐘以下。
Java 虛擬機(jī)結(jié)構(gòu)作為一個(gè)面試高頻考點(diǎn),你完全可以當(dāng)做你在復(fù)習(xí)面試知識,這樣興許你的學(xué)習(xí)的心態(tài)會好一些。
我還是不得不去網(wǎng)上摘下了這個(gè)圖,我想唯有用這張圖結(jié)合講解起來才更加的通俗易懂。
Java 虛擬機(jī)內(nèi)存區(qū)域確實(shí)就由這幾部分構(gòu)成:方法區(qū)、虛擬機(jī)棧、本地方法棧、堆、程序計(jì)數(shù)器。
程序計(jì)數(shù)器
程序計(jì)數(shù)器是一個(gè)較小的內(nèi)存空間,線程私有,它是唯一一個(gè)在 Java 虛擬機(jī)規(guī)范中沒有規(guī)定任何 OOM 情況的區(qū)域。
虛擬機(jī)棧
虛擬機(jī)棧和程序計(jì)數(shù)器一樣,同樣為線程所私有,并且生命周期和線程相同。。每個(gè)棧中的數(shù)據(jù)都是私有的,其他棧不允許訪問,每個(gè)方法被執(zhí)行的時(shí)候都會同時(shí)創(chuàng)建一個(gè)棧幀,每一個(gè)方法被調(diào)用直至執(zhí)行完成的過程,就對應(yīng)著一個(gè)棧幀在虛擬機(jī)棧從入棧到出棧的過程。虛擬機(jī)棧主要存放各種編譯期可知的基本數(shù)據(jù)類型和對象的引用。
本地方法棧
本地方法棧與虛擬機(jī)棧發(fā)揮的作用非常相似,其主要區(qū)別是虛擬機(jī)棧為虛擬機(jī)執(zhí)行 Java 方法(也就是字節(jié)碼)服務(wù),而本地房發(fā)展則是為虛擬機(jī)用到的 Native 方法服務(wù)。
Java 堆
Java 堆是垃圾收集器管理的主要區(qū)域,主要用于存放對象的實(shí)例,自然而然就成了 Java 虛擬機(jī)中管理內(nèi)存最大的一塊,并且它可以處于物理上不連續(xù)的內(nèi)存空間中,Java 堆在虛擬機(jī)啟動(dòng)的時(shí)候就進(jìn)行創(chuàng)建,并被所有線程所共享。
方法區(qū)
方法區(qū)和 Java 堆一樣,是各個(gè)線程共享的內(nèi)存區(qū)域,主要存儲已被虛擬機(jī)加載的類信息、常量、靜態(tài)變量、即時(shí)編譯器編譯后的代碼等數(shù)據(jù)。這個(gè)區(qū)域的內(nèi)存回收目標(biāo)主要是針對常量池的回收和對類型的寫在,較少發(fā)生垃圾收集行為。
上面對 Java 虛擬機(jī)結(jié)構(gòu)進(jìn)行了非常精簡的講解,大家可還對此清晰了一些?如果還是沒有太透徹其實(shí)沒有關(guān)系,多回顧幾遍,最好能自己畫一個(gè)圖,在一邊進(jìn)行理解。明天我們再來講一講我們另外一個(gè)面試非常高頻的考點(diǎn):垃圾回收算法,一起來探究 Java 虛擬機(jī)到底是怎么來回收一個(gè)無用的對象的。
轉(zhuǎn)載于:https://www.cnblogs.com/liushilin/p/11014168.html
總結(jié)
以上是生活随笔為你收集整理的每日一问:你了解 Java 虚拟机结构么?的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 2 均衡化直方图
- 下一篇: SpringBoot概述