您好,登錄后才能下訂單哦!
這篇“JVM運(yùn)行時(shí)數(shù)據(jù)區(qū)與JMM內(nèi)存模型是什么”文章的知識(shí)點(diǎn)大部分人都不太理解,所以小編給大家總結(jié)了以下內(nèi)容,內(nèi)容詳細(xì),步驟清晰,具有一定的借鑒價(jià)值,希望大家閱讀完這篇文章能有所收獲,下面我們一起來(lái)看看這篇“JVM運(yùn)行時(shí)數(shù)據(jù)區(qū)與JMM內(nèi)存模型是什么”文章吧。
JVM運(yùn)行時(shí)數(shù)據(jù)區(qū)可以分為元空間,堆,虛擬機(jī)棧,本地方法棧,程序計(jì)數(shù)器五大塊。
元空間(方法區(qū)):存放類模版對(duì)象,是線程共享的區(qū)域,在磁盤上,一般不會(huì)GC
堆空間:線程共享的區(qū)域,對(duì)象創(chuàng)建與GC的主要陣地
虛擬機(jī)棧:線程私有的,基本組成單位是棧幀,每個(gè)棧幀對(duì)應(yīng)一個(gè)方法,棧幀組成如下
局部變量表:存放方法變量信息
操作數(shù)棧:方法運(yùn)行的區(qū)域
動(dòng)態(tài)鏈接:指向方法模板對(duì)象,與虛方法表一起實(shí)現(xiàn)方法重寫
返回地址:方法的返回地址
本地方法棧:線程私有,本地方法的執(zhí)行區(qū)域
程序計(jì)數(shù)器:線程私有,負(fù)責(zé)在線程上下文切換的過(guò)程中記錄線程執(zhí)行到了哪個(gè)位置
通常情況下,當(dāng)CPU需要讀取主存時(shí),它會(huì)將主存的部分讀到CPU緩存中或者內(nèi)部寄存器中,然后在寄存器中執(zhí)行操作。當(dāng)CPU需要將結(jié)果寫回到主存中去時(shí),它會(huì)將內(nèi)部寄存器的值刷新到緩存中,然后在某個(gè)時(shí)間點(diǎn)將值刷新回主存。
在多處理器系統(tǒng)中,每個(gè)處理器都有自己的高速緩存,而它們又共享同一主內(nèi)存,因此就會(huì)存在緩存一致性問(wèn)題。為了解決一致性的問(wèn)題,需要各個(gè)處理器訪問(wèn)緩存時(shí)都遵循一些協(xié)議,在讀寫時(shí)要根據(jù)協(xié)議來(lái)進(jìn)行操作,這類協(xié)議有MSI、MESI等。
JMM內(nèi)存模型將內(nèi)容分為了線程私有內(nèi)存與主內(nèi)存兩部分,其與我們之前提到的硬件內(nèi)存模型的對(duì)應(yīng)關(guān)系如下所示:
私有內(nèi)存與主內(nèi)存的交互由如下八種操作控制:
一言以蔽之,volatile 關(guān)鍵字通過(guò)內(nèi)存屏障的形式來(lái)阻止指令重排,以維護(hù)變量的有序性與可見(jiàn)行。
一行代碼到執(zhí)行的過(guò)程中要經(jīng)歷以下的階段:
volatile 關(guān)鍵字有如下兩個(gè)作用:
保證被 volatile 修飾的共享變量對(duì)所有線程總是可見(jiàn)的,也就是當(dāng)一個(gè)線程修改了被 volatile 修飾共享變量的值,新值總是可以被其他線程立即得知。
禁止指令重排序優(yōu)化。
JVM中提供了四類內(nèi)存屏障指令:
loadload:兩個(gè)讀取操作之間
storestore:兩個(gè)寫操作之間
loadstore:讀寫操作之間
storelosd:寫讀操作之間
以上就是關(guān)于“JVM運(yùn)行時(shí)數(shù)據(jù)區(qū)與JMM內(nèi)存模型是什么”這篇文章的內(nèi)容,相信大家都有了一定的了解,希望小編分享的內(nèi)容對(duì)大家有幫助,若想了解更多相關(guān)的知識(shí)內(nèi)容,請(qǐng)關(guān)注億速云行業(yè)資訊頻道。
免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。