一区二区三区日韩精品-日韩经典一区二区三区-五月激情综合丁香婷婷-欧美精品中文字幕专区

分享

第4課:10分鐘內(nèi)圖解掌握全世界最易懂的jvm內(nèi)存模型內(nèi)幕

 看風(fēng)景D人 2019-04-25

內(nèi)容:

    1.圖解JVM內(nèi)存模型
    2.JVM內(nèi)存模型解密

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

二、JVM內(nèi)存模型解密

 

1. 線程私有:Stack、Native Method Area、Program Counter Register
    全局共享:Method Area 包含Constant Pool、Heap
    2. 堆(Heap)
        a)是java虛擬機(jī)所管理的內(nèi)存中最大的一塊內(nèi)存區(qū)域,也是被各個(gè)線程共享的內(nèi)存區(qū)域,該內(nèi)存區(qū)域存放了對(duì)象實(shí)例及數(shù)組(但不是所有的對(duì)象實(shí)例都在堆中)。
        b)其大小通過-Xms(最小值)和-Xmx(最大值)參數(shù)設(shè)置(最大最小值都要小于1G),前者為啟動(dòng)時(shí)申請(qǐng)的最小內(nèi)存,默認(rèn)為操作系統(tǒng)物理內(nèi)存的1/64,后者為JVM可申請(qǐng)的最大內(nèi)存,默認(rèn)為物理內(nèi)存的1/4,默認(rèn)當(dāng)空余堆內(nèi)存小于40%時(shí),JVM會(huì)增大堆內(nèi)存到-Xmx指定的大小,可通過-XX:MinHeapFreeRation=來指定這個(gè)比列。
        c)當(dāng)空余堆內(nèi)存大于70%時(shí),JVM會(huì)減小堆內(nèi)存的大小到-Xms指定的大小,可通過XX:MaxHeapFreeRation=來指定這個(gè)比列,當(dāng)然為了避免在運(yùn)行時(shí)頻繁調(diào)整Heap的大小,通常-Xms與-Xmx的值設(shè)成一樣。
        d)堆內(nèi)存 = 新生代+老年代+持久代。在我們垃圾回收的時(shí)候,我們往往將堆內(nèi)存分成新生代和老年代(大小比例1:2),新生代中由Eden和Survivor0,Survivor1組成,三者的比例是8:1:1,新生代的回收機(jī)制采用復(fù)制算法,在Minor GC的時(shí)候,我們都留一個(gè)存活區(qū)用來存放存活的對(duì)象,真正進(jìn)行的區(qū)域是Eden+其中一個(gè)存活區(qū),當(dāng)我們的對(duì)象時(shí)長(zhǎng)超過一定年齡時(shí)(默認(rèn)15,可以通過參數(shù)設(shè)置),將會(huì)把對(duì)象放入老年代,當(dāng)然大的對(duì)象會(huì)直接進(jìn)入老年代。
        e)老年代采用的回收算法是標(biāo)記整理算法。(更詳細(xì)的內(nèi)容將后續(xù)文章詳細(xì)介紹GC回收)

    3. 方法區(qū)(Method Area)
         a)方法區(qū)也稱"永久代",它用于存儲(chǔ)虛擬機(jī)加載的類信息、常量、靜態(tài)變量、是各個(gè)線程共享的內(nèi)存區(qū)域。
         b)默認(rèn)最小值為16MB,最大值為64MB(64位JVM由于指針膨脹,默認(rèn)是85M),可以通過-XX:PermSize 和 -XX:MaxPermSize 參數(shù)限制方法區(qū)的大小。
         c)它是一片連續(xù)的堆空間,永久代的垃圾收集是和老年代(old generation)捆綁在一起的,因此無論誰滿了,都會(huì)觸發(fā)永久代和老年代的垃圾收集。
         d)不過,一個(gè)明顯的問題是,當(dāng)JVM加載的類信息容量超過了參數(shù)-XX:MaxPermSize設(shè)定的值時(shí),應(yīng)用將會(huì)報(bào)OOM的錯(cuò)誤。
         e)參數(shù)是通過-XX:PermSize和-XX:MaxPermSize來設(shè)定的
         f)運(yùn)行時(shí)常量池(Runtime Constant Pool):是方法區(qū)的一部分,Class文件中除了有類的版本、字段、方法、接口等描述信息外,還有一項(xiàng)信息是常量池,用于存放編譯器生成的各種符號(hào)引用,這部分內(nèi)容將在類加載后放到方法區(qū)的運(yùn)行時(shí)常量池中。
         g)從JDK7開始移除永久代(但并沒有移除,還是存在),貯存在永久代的一部分?jǐn)?shù)據(jù)已經(jīng)轉(zhuǎn)移到了Java Heap或者是Native Heap:符號(hào)引用(Symbols)轉(zhuǎn)移到了native heap;字面量(interned strings)轉(zhuǎn)移到了java heap;類的靜態(tài)變量(class statics)轉(zhuǎn)移到了Java Heap。從JDK8開始使用元空間(Metaspace),元空間的大小受本地內(nèi)存限制,新參數(shù)(MaxMetaspaceSize)用于限制本地內(nèi)存分配給類元數(shù)據(jù)的大小。如果沒有指定這個(gè)參數(shù),元空間會(huì)在運(yùn)行時(shí)根據(jù)需要?jiǎng)討B(tài)調(diào)整。
        具體的可以查看這篇文章:https://blog.csdn.net/zhushuai1221/article/details/52122880 (Java 8: 從永久代(PermGen)到元空間(Metaspace))

    4.虛擬機(jī)棧(JVM Stack)
        a)描述的是Java方法執(zhí)行的內(nèi)存模型:每個(gè)方法被執(zhí)行的時(shí)候都會(huì)創(chuàng)建一個(gè)"棧幀",用于存儲(chǔ)局部變量表(包括參數(shù))、操作棧、方法出口等信息。
        b)每個(gè)方法被調(diào)用到執(zhí)行完的過程,就對(duì)應(yīng)著一個(gè)棧幀在虛擬機(jī)棧中從入棧到出棧的過程。
        c)聲明周期與線程相同,是線程私有的。
        d)棧幀由三部分組成:局部變量區(qū)、操作數(shù)棧、幀數(shù)據(jù)區(qū)。局部變量區(qū)被組織為以一個(gè)字長(zhǎng)為單位、從0開始計(jì)數(shù)的數(shù)組,和局部變量區(qū)一樣,操作數(shù)棧也被組織成一個(gè)以字長(zhǎng)為單位的數(shù)組。但和前者不同的是,它不是通過索引來訪問的,而是通過入棧和出棧來訪問的,可以看作為臨時(shí)數(shù)據(jù)的存儲(chǔ)區(qū)域。
        e)除了局部變量區(qū)和操作數(shù)棧外,java棧幀還需要一些數(shù)據(jù)來支持常量池解析、正常方法返回以及異常派發(fā)機(jī)制。這些數(shù)據(jù)都保存在java棧幀的幀數(shù)據(jù)區(qū)中。
        f)局部變量表: 存放了編譯器可知的各種基本數(shù)據(jù)類型、對(duì)象引用(引用指針,并非對(duì)象本身),其中64位長(zhǎng)度的long和double類型的數(shù)據(jù)會(huì)占用2個(gè)局部變量的空間,其余數(shù)據(jù)類型只占1個(gè)。局部變量表所需的內(nèi)存空間在編譯期間完成分配,當(dāng)進(jìn)入一個(gè)方法時(shí),這個(gè)方法需要在棧幀中分配多大的局部變量是完全確定的,在運(yùn)行期間棧幀不會(huì)改變局部變量表的大小空間。

    5.本地方法棧(Native Stack)
        與虛擬機(jī)?;绢愃?,區(qū)別在于虛擬機(jī)棧為虛擬機(jī)執(zhí)行的java方法服務(wù),而本地方法棧則是為Native方法服務(wù)。(棧的空間大小遠(yuǎn)遠(yuǎn)小于堆)

    6.程序計(jì)數(shù)器(PC Register)
       是最小的一塊內(nèi)存區(qū)域,它的作用是當(dāng)前線程所執(zhí)行的字節(jié)碼的行號(hào)指示器,在虛擬機(jī)的模型里,字節(jié)碼解釋器工作時(shí)就是通過改變這個(gè)計(jì)數(shù)器的值來選取下一條需要執(zhí)行的字節(jié)碼指令,分支、循環(huán)、異常處理、線程恢復(fù)等基礎(chǔ)功能都需要依賴計(jì)數(shù)器完成。

    7.直接內(nèi)存
       直接內(nèi)存并不是虛擬機(jī)內(nèi)存的一部分,也不是Java虛擬機(jī)規(guī)范中定義的內(nèi)存區(qū)域。jdk1.4中新加入的NIO,引入了通道與緩沖區(qū)的IO方式,它可以調(diào)用Native方法直接分配堆外內(nèi)存,這個(gè)堆外內(nèi)存就是本機(jī)內(nèi)存,不會(huì)影響到堆內(nèi)存的大小.

參考文章:JVM內(nèi)存模型總結(jié)

    本站是提供個(gè)人知識(shí)管理的網(wǎng)絡(luò)存儲(chǔ)空間,所有內(nèi)容均由用戶發(fā)布,不代表本站觀點(diǎn)。請(qǐng)注意甄別內(nèi)容中的聯(lián)系方式、誘導(dǎo)購買等信息,謹(jǐn)防詐騙。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請(qǐng)點(diǎn)擊一鍵舉報(bào)。
    轉(zhuǎn)藏 分享 獻(xiàn)花(0

    0條評(píng)論

    發(fā)表

    請(qǐng)遵守用戶 評(píng)論公約

    類似文章 更多

    欧美精品亚洲精品一区| 国产精品一区二区香蕉视频| 91老熟妇嗷嗷叫太91| 男女激情视频在线免费观看| 国产欧美日韩精品自拍| 亚洲欧美日本成人在线| 色鬼综合久久鬼色88| 成人国产一区二区三区精品麻豆| 国内胖女人做爰视频有没有| 国产精品午夜一区二区三区| 粉嫩国产一区二区三区在线| 91天堂素人精品系列全集| 国产伦精品一区二区三区高清版| 草草视频精品在线观看| 国产丝袜女优一区二区三区| 日韩欧美好看的剧情片免费| 日韩人妻毛片中文字幕| 亚洲女同一区二区另类| 亚洲一区二区三区三州| 丰满人妻一二三区av| 91天堂免费在线观看| 日本免费一级黄色录像 | 国产精品视频久久一区| 亚洲国产精品久久琪琪| 91亚洲国产—区=区a| 日本女优一区二区三区免费| 午夜传媒视频免费在线观看| 亚洲一区二区三区有码| 国产又大又硬又粗又湿| 日韩欧美91在线视频| 国产高清一区二区不卡| 成年人黄片大全在线观看| 一区二区三区日本高清| 国产乱久久亚洲国产精品| 在线免费国产一区二区| 在线观看免费无遮挡大尺度视频| 久久福利视频在线观看| 不卡一区二区在线视频| 九九热精品视频在线观看| 日本加勒比不卡二三四区| 精品精品国产自在久久高清|