更新時(shí)間:2020-10-29 17:35:43 來(lái)源:動(dòng)力節(jié)點(diǎn) 瀏覽1456次
JVM是java虛擬機(jī)的簡(jiǎn)稱(chēng),它實(shí)現(xiàn)了程序與操作系統(tǒng)的分離,從而實(shí)現(xiàn)了java的跨平臺(tái)性,所以我們有必要學(xué)習(xí)JVM運(yùn)行機(jī)制與原理等相關(guān)知識(shí)。JVM內(nèi)存結(jié)構(gòu)是大家需要學(xué)習(xí)的內(nèi)容,下面我們來(lái)介紹JVM內(nèi)存結(jié)構(gòu)是由哪些部分構(gòu)成的,一起來(lái)學(xué)習(xí)吧。
先來(lái)對(duì)JVM虛擬機(jī)進(jìn)行簡(jiǎn)單的介紹:(1)java程序經(jīng)過(guò)一次編譯之后,將java代碼編譯為字節(jié)碼也就是class文件,然后在不同的操作系統(tǒng)上依靠不同的java虛擬機(jī)進(jìn)行解釋?zhuān)詈笤俎D(zhuǎn)換為不同平臺(tái)的機(jī)器碼,最終得到執(zhí)行;(2)Java虛擬機(jī)(JVM)處在核心的位置,是程序與底層操作系統(tǒng)、硬件無(wú)關(guān)的關(guān)鍵;(3)JVM的下方是移植接口,移植接口由兩部分組成:適配器和Java操作系統(tǒng), 其中依賴(lài)于平臺(tái)的部分稱(chēng)為適配器,JVM 通過(guò)移植接口在具體的平臺(tái)和操作系統(tǒng)上實(shí)現(xiàn);(4)JVM 的上方是Java的基本類(lèi)庫(kù)和擴(kuò)展類(lèi)庫(kù)以及它們的API, 利用Java API編寫(xiě)的應(yīng)用程序(application) 和小程序(Java applet) 可以在任何Java平臺(tái)上運(yùn)行而無(wú)需考慮底層平臺(tái)。
JVM內(nèi)存結(jié)構(gòu)可以用下圖來(lái)表示:
下面是對(duì)JVM內(nèi)存結(jié)構(gòu)構(gòu)成部分的介紹:
一、程序計(jì)數(shù)器。java線(xiàn)程私有的,類(lèi)似于操作系統(tǒng)里的PC計(jì)數(shù)器,可以看做是當(dāng)前線(xiàn)程所執(zhí)行的字節(jié)碼的行號(hào)指示器。如果線(xiàn)程正在執(zhí)行的是一個(gè)java方法,這個(gè)計(jì)數(shù)器記錄的正在執(zhí)行的虛擬機(jī)字節(jié)碼指令的地址。如果正在執(zhí)行的是native方法,這個(gè)計(jì)數(shù)器值則為空。undefined此內(nèi)存區(qū)域是唯一一個(gè)在java虛擬規(guī)范中沒(méi)有規(guī)定任何OutOfMemoryError情況的區(qū)域
二、虛擬機(jī)棧(棧內(nèi)存)。java線(xiàn)程私有,虛擬機(jī)棧描述的是java方法執(zhí)行的內(nèi)存模型。每個(gè)方法在執(zhí)行的時(shí)候,都會(huì)創(chuàng)建一個(gè)棧幀用于存儲(chǔ)局部變量、操作數(shù)、動(dòng)態(tài)鏈接、方法出口等信息。每個(gè)方法調(diào)用都意味著一個(gè)棧幀在虛擬機(jī)棧中入棧到出棧的過(guò)程。
三、本地方法棧,和java虛擬機(jī)棧的作用類(lèi)似,區(qū)別是該區(qū)域?yàn)镴VM提供使用Native方法的服務(wù)。
四、堆內(nèi)存。所有線(xiàn)程共享的一塊區(qū)域,垃圾回收器管理的主要區(qū)域。目前主要垃圾回收算法都是分代收集算法,所以java堆中還可以細(xì)分為:新生代和老年代,再細(xì)致一點(diǎn)的還有eden區(qū),from survivor、to survivor,默認(rèn)情況下是8:1:1的比例。根據(jù)java虛擬機(jī)規(guī)范的規(guī)定,java堆可以處于物理上不連續(xù)的內(nèi)存空間中,只要邏輯上是連續(xù)的即可,就像我們的磁盤(pán)一樣。
五、方法區(qū)。各個(gè)線(xiàn)程共享的一個(gè)區(qū)域,用于存儲(chǔ)虛擬機(jī)加載的類(lèi)信息,常量、靜態(tài)變量,即時(shí)編譯器編譯后的代碼等數(shù)據(jù)。雖然虛擬機(jī)規(guī)范中把方法區(qū)描述成堆的一個(gè)邏輯部分,但是他卻有一個(gè)別名叫Non-heap 非堆,目的是為了與java堆區(qū)分開(kāi)來(lái)。運(yùn)行時(shí)常量池。是方法區(qū)的一部分,用于存放編譯器生成的各種字面量和符號(hào)引用。
JVM是java的虛擬機(jī),在面試中,JVM面試題的出現(xiàn)幾率都很大,所以也算是java編程中的重點(diǎn)學(xué)習(xí)內(nèi)容,學(xué)好JVM內(nèi)存結(jié)構(gòu)有助于我們掌握J(rèn)VM原理和相關(guān)操作,所以大家務(wù)必要學(xué)會(huì)JVM內(nèi)存結(jié)構(gòu)的內(nèi)容,如果還有哪里不清楚的地方,可以在本站的java教程中找到答案。
0基礎(chǔ) 0學(xué)費(fèi) 15天面授
有基礎(chǔ) 直達(dá)就業(yè)
業(yè)余時(shí)間 高薪轉(zhuǎn)行
工作1~3年,加薪神器
工作3~5年,晉升架構(gòu)
提交申請(qǐng)后,顧問(wèn)老師會(huì)電話(huà)與您溝通安排學(xué)習(xí)
初級(jí) 202925
初級(jí) 203221
初級(jí) 202629
初級(jí) 203743