溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶服務(wù)條款》

JVM運(yùn)行時(shí)數(shù)據(jù)區(qū)與JMM內(nèi)存模型是什么

發(fā)布時(shí)間:2022-08-01 11:17:57 來(lái)源:億速云 閱讀:145 作者:iii 欄目:開(kāi)發(fā)技術(shù)

這篇“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)存模型是什么”文章吧。

    1. JVM 運(yùn)行時(shí)數(shù)據(jù)區(qū)

    JVM運(yùn)行時(shí)數(shù)據(jù)區(qū)可以分為元空間,堆,虛擬機(jī)棧,本地方法棧,程序計(jì)數(shù)器五大塊。

    JVM運(yùn)行時(shí)數(shù)據(jù)區(qū)與JMM內(nèi)存模型是什么

    • 元空間(方法區(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è)位置

    2. JMM 內(nèi)存模型

    硬件內(nèi)存模型

    JVM運(yùn)行時(shí)數(shù)據(jù)區(qū)與JMM內(nèi)存模型是什么

    通常情況下,當(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

    JMM內(nèi)存模型將內(nèi)容分為了線程私有內(nèi)存與主內(nèi)存兩部分,其與我們之前提到的硬件內(nèi)存模型的對(duì)應(yīng)關(guān)系如下所示:

    JVM運(yùn)行時(shí)數(shù)據(jù)區(qū)與JMM內(nèi)存模型是什么

    私有內(nèi)存與主內(nèi)存的交互由如下八種操作控制:

    JVM運(yùn)行時(shí)數(shù)據(jù)區(qū)與JMM內(nèi)存模型是什么

    3. 可見(jiàn)行與 volatile 關(guān)鍵字

    一言以蔽之,volatile 關(guān)鍵字通過(guò)內(nèi)存屏障的形式來(lái)阻止指令重排,以維護(hù)變量的有序性與可見(jiàn)行。

    一行代碼到執(zhí)行的過(guò)程中要經(jīng)歷以下的階段:

    JVM運(yùn)行時(shí)數(shù)據(jù)區(qū)與JMM內(nèi)存模型是什么

    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è)資訊頻道。

    向AI問(wèn)一下細(xì)節(jié)

    免責(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)容。

    AI