Java開發(fā)現(xiàn)在面試越來越難了,進(jìn)大廠必備的JVM、多線程高并發(fā)這都是最基礎(chǔ)的知識了,今天我們一起來學(xué)習(xí)Java虛擬機(jī)入門。
運(yùn)行時(shí)數(shù)據(jù)區(qū)域
Java虛擬機(jī)在執(zhí)行Java程序的過程中會(huì)把它所管理的內(nèi)存劃分為若干個(gè)不同的數(shù)據(jù)區(qū)域,主要有這么幾個(gè)區(qū)域,并且對每個(gè)區(qū)域進(jìn)行介紹。

程序計(jì)數(shù)器
程序計(jì)數(shù)器(Program Counter Register)它是一塊較小的內(nèi)存空間,它是記錄當(dāng)前線程所執(zhí)行到的字節(jié)碼的行號。因?yàn)橛捎贘ava虛擬機(jī)的多線程是通過線程輪流切換、以及分配處理器執(zhí)行時(shí)間的方式來實(shí)現(xiàn)的,一個(gè)處理器都只會(huì)執(zhí)行一條線程中的指令。為了讓線程切換后能夠恢復(fù)到正常的執(zhí)行位置,所以每一條線程都有一個(gè)獨(dú)立的程序計(jì)數(shù)器,這樣線程之間計(jì)數(shù)器互不影響。

Java虛擬機(jī)棧
和程序計(jì)數(shù)器一樣是線程私有,它的生命周期是與線程相同的。Java虛擬機(jī)是Java執(zhí)行方法的內(nèi)存模型,在每個(gè)方法執(zhí)行時(shí)都會(huì)同步創(chuàng)建一個(gè)棧幀(Stack Frame),主要是用來存儲:局部變量表、操作數(shù)棧、動(dòng)態(tài)鏈接、方法出口等信息。
本地方法棧
本地方法棧就是為虛擬機(jī)使用到的本地(Native) 方法服務(wù)的。
Java堆(Heap)
Java堆是虛擬機(jī)所管理的內(nèi)存中最大的一塊,是所有線程共享的一塊區(qū)域,唯一的目的就是存放對象實(shí)例,并且是“幾乎”所有的對象的實(shí)例都是在“Java堆”分配內(nèi)存的。
同時(shí)Java堆也是垃圾收集器管理的內(nèi)存區(qū)域,也稱之為“GC堆”。由于現(xiàn)在基本采用分代回收垃圾器算法,所以Java堆又可以分為:新生代、老年代。
法區(qū)
方法區(qū)也是線程共享的內(nèi)存區(qū)域,主要存儲已被虛擬機(jī)加載的類型信息、常量、靜態(tài)變量、即時(shí)編譯器編譯后的代碼緩存等數(shù)據(jù)。
很多Java程序員都習(xí)慣在 HotSpot虛擬機(jī)上開發(fā)、部署程序,很多人都更愿意把方法區(qū)稱呼為“永久代“。到了 JDK 8,終于完全廢棄了永久代的概念,改用與JRockit、J9一樣在本地內(nèi)存中實(shí)現(xiàn)的元空間(Metaspace)來代替了。注意:這區(qū)域的內(nèi)存回收目標(biāo)主要是針對常量池的回收和對類型的卸載。
補(bǔ)充
運(yùn)行時(shí)常量池:它是方法區(qū)的一部分,用于存放編譯期生成的各種字面量與符號引用,這部分內(nèi)容將在類加載后存放到方法區(qū)的運(yùn)行時(shí)常量池中。對于初學(xué)者想深入JVM虛擬機(jī)原理,國內(nèi)非常不錯(cuò)的深入理解Java虛擬機(jī)第三版這本,值得Java程序員看的。
-
JAVA
+關(guān)注
關(guān)注
20文章
3005瀏覽量
116799 -
JVM
+關(guān)注
關(guān)注
0文章
161瀏覽量
13084 -
虛擬機(jī)
+關(guān)注
關(guān)注
1文章
973瀏覽量
30683
發(fā)布評論請先 登錄
Java并發(fā)編程的“基石”——多線程概念初識
【虛擬化數(shù)據(jù)恢復(fù)】ESXI虛擬機(jī)還原快照致數(shù)據(jù)丟失?完整恢復(fù)方案解析
【米爾全志T153開發(fā)板評測】虛擬機(jī)資料下載與安裝
虛擬機(jī)數(shù)據(jù)恢復(fù)—虛擬機(jī)vmdk文件被刪除的數(shù)據(jù)恢復(fù)案例
服務(wù)器數(shù)據(jù)恢復(fù)—EqualLogic存儲硬盤離線導(dǎo)致上層虛擬機(jī)不可用的數(shù)據(jù)恢復(fù)案例
Arm架構(gòu)助力Azure Cobalt 100虛擬機(jī)工作負(fù)載性能提升
虛擬機(jī)數(shù)據(jù)恢復(fù)—異常斷電致ESXI存儲失聯(lián)?這份實(shí)戰(zhàn)數(shù)據(jù)恢復(fù)案例請收好
Arm Neoverse CPU上大代碼量Java應(yīng)用的性能測試
蜂鳥e203在虛擬機(jī)unbuntu上面驗(yàn)證時(shí)報(bào)錯(cuò)的可能原因及解決措施
搭建自己的ubuntu系統(tǒng)之創(chuàng)建ubuntu虛擬機(jī)
中軟國際鴻云虛擬機(jī)安裝指南
迅為RK3588開發(fā)板掛載Windows以及虛擬機(jī)Ubuntu測試
TECS OpenStack資源池虛擬機(jī)網(wǎng)絡(luò)二層地址無法互通的問題處理
虛擬化數(shù)據(jù)恢復(fù)—XenServer虛擬化平臺上VPS不可用的數(shù)據(jù)恢復(fù)案例
Vsan數(shù)據(jù)恢復(fù)——Vsan分布式文件系統(tǒng)上虛擬機(jī)不可用的數(shù)據(jù)恢復(fù)
Java:JVM虛擬機(jī)的入門知識
評論