摘要:的內(nèi)存模型概述虛擬機(jī)在執(zhí)行程序的過程中,會把它所管理的內(nèi)存劃分為若干個不同的數(shù)據(jù)區(qū)域。程序計數(shù)器這是一塊較小的內(nèi)存,它可以看做是當(dāng)前線程所執(zhí)行的字節(jié)碼的行號指示器。
JVM的內(nèi)存模型 概述
Java虛擬機(jī)在執(zhí)行java程序的過程中,會把它所管理的內(nèi)存劃分為若干個不同的數(shù)據(jù)區(qū)域。這些區(qū)域都有各自的用途,以及創(chuàng)建和銷毀的時間,有的區(qū)域隨著虛擬機(jī)進(jìn)程的啟動而存在,有些區(qū)域則依賴用戶線程的啟動和結(jié)束而建立和銷毀。
java虛擬機(jī)所管理的內(nèi)存包括以下幾個運(yùn)行時數(shù)據(jù)區(qū)域:
方法區(qū)(包括運(yùn)行時常量池):存儲類信息、常量、靜態(tài)變量、即時編譯器編譯后的代碼等;各種字面量和符號引用。
Java堆:存儲java對象。
虛擬機(jī)棧:存儲方法以及方法中的存儲局部變量表(存放基本數(shù)據(jù)類型和引用類型)、操作數(shù)棧、動態(tài)鏈接、方法出口等信息。
本地方法棧:和虛擬機(jī)棧類似,只不過存儲的是native方法。
程序計數(shù)器:存儲當(dāng)前線程執(zhí)行的字節(jié)碼的行號。
其中屬于所有線程共享的數(shù)據(jù)區(qū)是:方法區(qū)、堆;
屬于線程隔離(線程安全)的數(shù)據(jù)區(qū)是:虛擬機(jī)棧、本地方法區(qū)、程序計數(shù)器。
Java堆對大多數(shù)應(yīng)用來說,Java堆是JVM管理的內(nèi)存中最大的一塊。在虛擬機(jī)啟動時創(chuàng)建,唯一目的就是存放對象實例,幾乎所有的對象實例都在這里分配內(nèi)存。
Java堆是垃圾收集器管理的主要區(qū)域,因此很多時候也叫GC堆。從內(nèi)存回收的角度看,由于現(xiàn)在收集器基本都是采用分代收集算法,所以Java堆還可以細(xì)分為:新生代和老年代。
如果在java堆中沒有完成實例分配,并且堆也無法拓展時,將會拋出OutOfMemoryError異常。
Java進(jìn)程啟動時,虛擬機(jī)就會分配一塊初始堆空間,可以使用參數(shù)-Xms指定這塊空間的大小;
如果初始堆空間耗盡,虛擬機(jī)會對堆空間繼續(xù)擴(kuò)展,其擴(kuò)展上限為最大堆空間,最大堆空間可以使用參數(shù)-Xmx指定;
方法區(qū)方法區(qū)用于存儲已被虛擬機(jī)加載的類信息、常量、靜態(tài)變量、即時編譯器編譯后的代碼等數(shù)據(jù)。雖然java虛擬機(jī)規(guī)范將方法去描述為一個邏輯部分,但是它卻有一個別名叫做Non-Heap(非堆),目的是與java堆區(qū)分開來。
當(dāng)該方法區(qū)無法滿足內(nèi)存分配需求時,將拋出OutOfMemoryError錯誤。
運(yùn)行時常量池
運(yùn)行時常量池是方法區(qū)的一部分。Class文件中除了有類的版本、字段、方法、接口等描述信息外,還有一項信息是常量池,用于存放編譯期生成的各種字面量和符號引用,這部分內(nèi)容在JVM類加載后進(jìn)入方法區(qū)的運(yùn)行時常量池中存放。也會拋出OutOfMemoryError錯誤。
虛擬機(jī)棧它的生命周期與線程相同,虛擬機(jī)棧描述的是Java方法執(zhí)行的內(nèi)存模型:每個方法在執(zhí)行的同時會創(chuàng)建一個棧幀,用于存儲局部變量表(存放基本數(shù)據(jù)類型和引用類型)、操作數(shù)棧、動態(tài)鏈接、方法出口等信息。每個方法從調(diào)用直至執(zhí)行完成的過程,就對應(yīng)著一個棧幀在虛擬機(jī)棧中入棧到出棧的過程。平時所說的堆內(nèi)存、棧內(nèi)存中的棧內(nèi)存就是虛擬機(jī)棧。
當(dāng)線程請求的棧深度大于虛擬機(jī)所允許的深度,將拋出StackOverFlowError異常;如果虛擬機(jī)??梢詣討B(tài)擴(kuò)展(大部分虛擬機(jī)都支持動態(tài)擴(kuò)展,只不過虛擬機(jī)規(guī)范也允許固定長度的虛擬機(jī)棧),如果拓展時無法申請到足夠的內(nèi)存,就會拋出OutOfMemoryError異常。
本地方法棧和虛擬機(jī)棧類似,區(qū)別就是本地方法棧為虛擬機(jī)使用的Native方法服務(wù),與虛擬機(jī)棧一樣,也會拋出OutOfMemoryError和StackOverFlowError異常。
程序計數(shù)器這是一塊較小的內(nèi)存,它可以看做是當(dāng)前線程所執(zhí)行的字節(jié)碼的行號指示器。字節(jié)碼解釋器工作時就是通過改變這個計數(shù)器來選取下一條需要執(zhí)行的字節(jié)碼指令,分支、循環(huán)、跳轉(zhuǎn)、異常處理、線程恢復(fù)等基礎(chǔ)功能都需要依賴這個計數(shù)器完成。
如果線程正在執(zhí)行一個java方法,這個計數(shù)器記錄的是正在執(zhí)行的虛擬機(jī)字節(jié)碼指令的地址;如果正在執(zhí)行的是native方法,這個計數(shù)器則為空。
此內(nèi)存區(qū)域是唯一一個java虛擬機(jī)規(guī)范里面沒有規(guī)定任何OutOfMemoryError情況的區(qū)域。
參考:《深入理解Java虛擬機(jī)》— 周志明
文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請注明本文地址:http://www.ezyhdfw.cn/yun/69140.html
摘要:作為一個程序員,不了解內(nèi)存模型就不能寫出能夠充分利用內(nèi)存的代碼。程序計數(shù)器是在電腦處理器中的一個寄存器,用來指示電腦下一步要運(yùn)行的指令序列。在虛擬機(jī)中,本地方法棧和虛擬機(jī)棧是共用同一塊內(nèi)存的,不做具體區(qū)分。 作為一個 Java 程序員,不了解 Java 內(nèi)存模型就不能寫出能夠充分利用內(nèi)存的代碼。本文通過對 Java 內(nèi)存模型的介紹,讓讀者能夠了解 Java 的內(nèi)存的分配情況,適合 Ja...
摘要:內(nèi)存模型和運(yùn)行時數(shù)據(jù)區(qū)域的關(guān)系主內(nèi)存對應(yīng)著堆,工作內(nèi)存對應(yīng)著棧。在的單例模式中有運(yùn)用到二運(yùn)行時數(shù)據(jù)區(qū)域內(nèi)存區(qū)域因為的運(yùn)行時數(shù)據(jù)區(qū)域一直在改善,所以不同版本之間會有不同。 一、java內(nèi)存模型 showImg(https://segmentfault.com/img/remote/1460000016694250?w=1810&h=941); java定義內(nèi)存模型的目的是:為了屏蔽各種...
摘要:內(nèi)存模型首先介紹下程序具體執(zhí)行的過程源代碼文件后綴會被編譯器編譯為字節(jié)碼文件后綴由中的類加載器加載各個類的字節(jié)碼文件,加載完畢之后,交由執(zhí)行引擎執(zhí)行在整個程序執(zhí)行過程中,會用一段空間來存儲程序執(zhí)行期間需要用到的數(shù)據(jù)和相關(guān)信息,這段空間一般被 [TOC] JVM內(nèi)存模型 首先介紹下Java程序具體執(zhí)行的過程: Java源代碼文件(.java后綴)會被Java編譯器編譯為字節(jié)碼文件(....
摘要:是描述方法執(zhí)行的內(nèi)存模型每個方法執(zhí)行的時候會同時創(chuàng)建一個棧幀,用于存儲局部變量表操作數(shù)棧動態(tài)連接返回地址方法出口等信息。虛擬機(jī)是使用局部變量表完成參數(shù)值到參數(shù)變量表的傳遞過程。堆內(nèi)存管理最大的一塊。 showImg(https://segmentfault.com/img/bVLqsv?w=475&h=398); 1. 虛擬機(jī)棧 VM Stack 線程私有,生命周期與線程相同。VM S...
摘要:在之前,它是一個備受爭議的關(guān)鍵字,因為在程序中使用它往往收集器理解和原理分析簡稱,是后提供的面向大內(nèi)存區(qū)數(shù)到數(shù)多核系統(tǒng)的收集器,能夠?qū)崿F(xiàn)軟停頓目標(biāo)收集并且具有高吞吐量具有更可預(yù)測的停頓時間。 35 個 Java 代碼性能優(yōu)化總結(jié) 優(yōu)化代碼可以減小代碼的體積,提高代碼運(yùn)行的效率。 從 JVM 內(nèi)存模型談線程安全 小白哥帶你打通任督二脈 Java使用讀寫鎖替代同步鎖 應(yīng)用情景 前一陣有個做...
閱讀 1288·2021-09-03 10:44
閱讀 674·2019-08-30 13:13
閱讀 2857·2019-08-30 13:11
閱讀 2026·2019-08-30 12:59
閱讀 1106·2019-08-29 15:32
閱讀 1656·2019-08-29 15:25
閱讀 1095·2019-08-29 12:24
閱讀 1358·2019-08-27 10:58