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