溫馨提示×

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

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

如何淺析CPU高速緩存和JVM內(nèi)存模型

發(fā)布時(shí)間:2021-10-23 16:08:47 來(lái)源:億速云 閱讀:261 作者:柒染 欄目:大數(shù)據(jù)

本篇文章為大家展示了如何淺析CPU高速緩存和JVM內(nèi)存模型,內(nèi)容簡(jiǎn)明扼要并且容易理解,絕對(duì)能使你眼前一亮,通過(guò)這篇文章的詳細(xì)介紹希望你能有所收獲。

如何淺析CPU高速緩存和JVM內(nèi)存模型

在java學(xué)習(xí)過(guò)程中,JVM的內(nèi)存模型是非常重要的,今天,我們通過(guò)學(xué)習(xí)計(jì)算機(jī)的內(nèi)存模型來(lái)幫助我們理解JVM內(nèi)存。

一、計(jì)算機(jī)存儲(chǔ)介質(zhì):

如何淺析CPU高速緩存和JVM內(nèi)存模型

圖一:計(jì)算機(jī)的簡(jiǎn)化存儲(chǔ)介質(zhì)

(1)、計(jì)算機(jī)中幾種存儲(chǔ)介質(zhì)分類(lèi):

        a.從下往上,硬盤(pán)、內(nèi)存、緩存、寄存器;
        b.高速緩存的訪問(wèn)讀取速度大概為:1~X ns,
        c.主存的讀取速度:100ns
        d.硬盤(pán)的讀取速度:Xms

        e.一般情況下高速緩存的訪問(wèn)速度是主存的 10~100 倍,而主存的訪問(wèn)速度則是硬盤(pán)的 1~10W 倍;

(2)、機(jī)械硬的讀取訪問(wèn)時(shí)間分析:
        a.尋道時(shí)間: 是指將讀寫(xiě)磁頭移動(dòng)至正確的磁道上所需要的時(shí)間。平均尋道時(shí)間大致為 3-15ms。
        b.旋轉(zhuǎn)延遲時(shí)間: 盤(pán)片旋轉(zhuǎn)將請(qǐng)求數(shù)據(jù)所在扇區(qū)移至讀寫(xiě)磁頭下方所需要的時(shí)間。旋轉(zhuǎn)延遲取決于磁盤(pán)轉(zhuǎn)速,通常使用磁盤(pán)旋轉(zhuǎn)一周所需時(shí)間的 1/2 表示。比如,7200 rpm 的磁盤(pán)平均旋轉(zhuǎn)延遲大約為 60 * 1000 / 7200 / 2 = 4.17ms,而轉(zhuǎn)速為 15000 rpm 的磁盤(pán)其平均旋轉(zhuǎn)延遲為 2ms。
        c.數(shù)據(jù)傳輸時(shí)間: 完成傳輸所請(qǐng)求的數(shù)據(jù)所需要的時(shí)間,它取決于數(shù)據(jù)傳輸率,其值等于數(shù)據(jù)大小除以數(shù)據(jù)傳輸率。目前 IDE/ATA 能達(dá)到 133MB/s,SATA II 可達(dá)到 300MB/s 的接口數(shù)據(jù)傳輸率。數(shù)據(jù)傳輸時(shí)間通常遠(yuǎn)小于前兩部分消耗時(shí)間。簡(jiǎn)單計(jì)算時(shí)可忽略。

(3)、擴(kuò)展了解:順序讀取和隨機(jī)讀取
        機(jī)械硬盤(pán)的磁頭移動(dòng)至正確的磁道上需要時(shí)間,隨機(jī)讀寫(xiě)時(shí),磁頭不停的移動(dòng),時(shí)間都花在了磁頭尋道上,導(dǎo)致的就是性能不高。所以,對(duì)于機(jī)械硬盤(pán)來(lái)說(shuō),連續(xù)讀寫(xiě)性很好,但隨機(jī)讀寫(xiě)性能很差。

(4)、局部性原理與磁盤(pán)預(yù)讀
        由于存儲(chǔ)介質(zhì)的特性,硬盤(pán)本身存取就比主存慢很多,再加上機(jī)械運(yùn)動(dòng)耗費(fèi),硬盤(pán)的存取速度往往是主存的幾百分分之一,因此為了提高效率,要盡量減少磁盤(pán) I/O。由于磁盤(pán)順序讀取的效率很高(不需要尋道時(shí)間,只需很少的旋轉(zhuǎn)時(shí)間),因此對(duì)于具有局部性的程序來(lái)說(shuō),預(yù)讀可以提高 I/O 效率。磁盤(pán)往往也不是嚴(yán)格按需讀取,而是每次都會(huì)預(yù)讀,即使只需要一個(gè)字節(jié),磁盤(pán)也會(huì)從這個(gè)位置開(kāi)始,順序向后讀取一定長(zhǎng)度的數(shù)據(jù)放入內(nèi)存。這樣做的理論依據(jù)是計(jì)算機(jī)科學(xué)中著名的局部性原理:當(dāng)一個(gè)數(shù)據(jù)被用到時(shí),其附近的數(shù)據(jù)也通常會(huì)馬上被使用。

備注:擴(kuò)展知識(shí)其實(shí)是和高性能Mysql的讀寫(xiě)效率有關(guān),大家可以擴(kuò)展研究一下。 

二、CPU高速緩存

(1)、關(guān)于高速緩存的幾個(gè)問(wèn)題

    a.什么是CPU高速緩存:CPU與內(nèi)存之間的臨時(shí)存儲(chǔ)器
    b.為什么需要CPU高速緩存:
        1、它的容量比內(nèi)存小的多但是交換速度卻比內(nèi)存要快得多。

        2、高速緩存的出現(xiàn)主要是為了解決CPU運(yùn)算速度與內(nèi)存讀寫(xiě)速度不匹配的矛盾,因?yàn)镃PU運(yùn)算速度要比內(nèi)存讀寫(xiě)速度快很多,這樣會(huì)使CPU花費(fèi)很長(zhǎng)時(shí)間等待數(shù)據(jù)到來(lái)或把數(shù)據(jù)寫(xiě)入內(nèi)存。在緩存中的數(shù)據(jù)是內(nèi)存中的一小部分,但這一小部分是短時(shí)間內(nèi)CPU即將訪問(wèn)的,當(dāng)CPU調(diào)用大量數(shù)據(jù)時(shí),就可先緩存中調(diào)用,從而加快讀取速度。
    c.高速緩存模型
         cpu緩存行->一級(jí)緩存->二級(jí)緩存->三級(jí)緩存->主存;

    d.多線程下的緩存一致性問(wèn)題:

緩存一致性協(xié)議。最出名的就是Intel 的MESI協(xié)議,MESI協(xié)議保證了每個(gè)緩存中使用的共享變量的副本是一致的。它核心的思想是:當(dāng)CPU寫(xiě)數(shù)據(jù)時(shí),如果發(fā)現(xiàn)操作的變量是共享變量,即在其他CPU中也存在該變量的副本,會(huì)發(fā)出信號(hào)通知其他CPU將該變量的緩存行置為無(wú)效狀態(tài),因此當(dāng)其他CPU需要讀取這個(gè)變量時(shí),發(fā)現(xiàn)自己緩存中緩存該變量的緩存行是無(wú)效的,那么它就會(huì)從內(nèi)存重新讀取。
(2)、多CPU緩存與多線程緩存讀寫(xiě)
      1.每個(gè)cpu有自己?jiǎn)为?dú)的高速緩存區(qū)
      2.訪問(wèn)跨cpu緩存數(shù)據(jù)很慢,當(dāng)跨cup1訪問(wèn)另一個(gè)cpu2數(shù)據(jù)時(shí),會(huì)把cpu2中的數(shù)據(jù)copy到cpu2中保留一個(gè)副本.
      3.多個(gè)cpu緩存內(nèi)可能包含相同的數(shù)據(jù)緩存行
      4.cpu如果修改緩存行數(shù)據(jù),將發(fā)出一個(gè)RFO(Request For Owner)請(qǐng)求, 獲取這行數(shù)據(jù)的權(quán)限,對(duì)次行數(shù)據(jù)進(jìn)行標(biāo)識(shí),其它c(diǎn)pu線程無(wú)法對(duì)此行數(shù)據(jù)進(jìn)行操作
      5.如果cpu數(shù)據(jù)變量副本引用的值發(fā)生變化,計(jì)算機(jī)會(huì)強(qiáng)制刷新引用此數(shù)據(jù)的各個(gè)cpu對(duì)應(yīng)的緩存行,保證緩存行數(shù)據(jù)統(tǒng)一
      6.緩存行數(shù)據(jù)更新不是以包含變量為最小單位,是以緩存行為最小單位。若緩存行包含了n個(gè)數(shù)據(jù),其中一個(gè)的值被改變,那么整個(gè)緩存的其它n-1個(gè)值得都要重新加載

如何淺析CPU高速緩存和JVM內(nèi)存模型

  圖二:多CPU緩存讀寫(xiě)

(3)、多CPU讀取過(guò)程:
      1.緩存行變量數(shù)據(jù) x,y,而且在其它c(diǎn)up緩存保存副本(cpu1,cpu2...)
      2.cpu1修改x,cpu2修改y
      3.cpu1首先獲得執(zhí)行權(quán),修改x值成功
      4.x值刷新會(huì)主內(nèi)存
      5.cpu2 x,y對(duì)應(yīng)緩存行置為無(wú)效
      6.cpu2..... 緩存行從內(nèi)存獲取最新x,y值
      7.cpu2獲得執(zhí)行權(quán),修改y成功
      8.cpu1 緩存行重復(fù)4-6

三、了解JVM的內(nèi)存模型:

如何淺析CPU高速緩存和JVM內(nèi)存模型

圖三:JVM內(nèi)存模型

        根據(jù)計(jì)算機(jī)的內(nèi)存模型,可以簡(jiǎn)單的想象一下JVM的內(nèi)存模型設(shè)計(jì),是不是同樣需要一個(gè)主存,一個(gè)高速緩存,和一個(gè)CPU處理器。

JVM運(yùn)行時(shí)的數(shù)據(jù)區(qū)的內(nèi)存模型
<1>.線程數(shù)據(jù)共享區(qū):方法區(qū)和堆
<2>.線程數(shù)據(jù)隔離區(qū):每個(gè)線程都有一個(gè)獨(dú)立的內(nèi)存:棧,程序計(jì)數(shù)器(PC寄存器),本地方法棧;
(a).堆:存放的是運(yùn)行時(shí)new出來(lái)的對(duì)象,數(shù)組,以及實(shí)例變量。堆中的內(nèi)存分配還可以更加細(xì)化,由于jvm的垃圾回收分代收集算法,又將堆內(nèi)存分為年輕代,老年代和永久代內(nèi)存區(qū);
       年輕代:分為Eden和兩個(gè)Serivious 區(qū):可以通過(guò)參數(shù)配置來(lái)分配新生代的大小-Xmn
       老年代:是多次YoungGC 還存活的對(duì)象,會(huì)被移動(dòng)到老年代;
       永久代:一些大對(duì)象,無(wú)法被GC的,會(huì)存放到永久代;
      所以堆對(duì)應(yīng)上的就相當(dāng)于計(jì)算機(jī)的主存,所有的對(duì)象信息都會(huì)存儲(chǔ)到這里。
(b).方法區(qū):存放的是java類(lèi)的元信息,數(shù)據(jù)結(jié)構(gòu),類(lèi)的信息,和初始化的靜態(tài)變量。方法區(qū)可以看作一個(gè)計(jì)算機(jī)三級(jí)緩存,程序的執(zhí)行都會(huì)依賴(lài)獲取類(lèi)信息
(c).本地方法棧:本地方法的調(diào)用信息,相當(dāng)于一個(gè)CUP的三級(jí)緩存
(d).棧內(nèi)存:每個(gè)線程運(yùn)行都會(huì)有獨(dú)立的棧內(nèi)存空間,主要存儲(chǔ)的是程序運(yùn)行時(shí)的對(duì)象引用和一些基本類(lèi)型的變量信息,還有一個(gè)地址信息。所以棧內(nèi)存相當(dāng)于高速緩存中的一級(jí)緩存;

    1、一個(gè)線程會(huì)有單獨(dú)的棧幀,線程之間互相不干擾
    2、棧內(nèi)存中存放的都是基本類(lèi)型和對(duì)象的句柄。
    3、存取速度比堆內(nèi)存塊,僅次于寄存器
    4、棧溢出:遞歸調(diào)用,內(nèi)存不夠新建棧幀,StackOverflowError

    5.棧內(nèi)存溢出:OutOfMemoryError,不夠新建線程

(e).程序計(jì)數(shù)器:一些JVM的操作指令信息。相當(dāng)于CPU處理器

不對(duì)的地方,煩請(qǐng)指正

如何淺析CPU高速緩存和JVM內(nèi)存模型

圖四、JVM內(nèi)存模型

上述內(nèi)容就是如何淺析CPU高速緩存和JVM內(nèi)存模型,你們學(xué)到知識(shí)或技能了嗎?如果還想學(xué)到更多技能或者豐富自己的知識(shí)儲(chǔ)備,歡迎關(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