<ins id="6k1m6"><video id="6k1m6"></video></ins>

    <ruby id="6k1m6"><option id="6k1m6"></option></ruby>
    <code id="6k1m6"><option id="6k1m6"></option></code>
  1. <output id="6k1m6"></output>
    400-650-7353
    您所在的位置:首頁(yè) > IT干貨資料 > java > 【Java基礎知識】什么是JVM?JVM內存模型由什么組成?(上)

    【Java基礎知識】什么是JVM?JVM內存模型由什么組成?(上)

    本篇介紹JVM虛擬機中運行時(shí)數據區的五個(gè)內存區域:堆、方法區、虛擬機棧、本地方法棧、程序計數器。這些地方也是我們平時(shí)開(kāi)發(fā)中最常接觸到的地方,所以對其有所掌握了解還是很有必要的,也有助于JVM問(wèn)題排查。

    JVM是Java Virtual Machine(Java虛擬機)的縮寫(xiě),JVM是一個(gè)虛構出來(lái)的計算機,有著(zhù)自己完善的硬件架構,如處理器、堆棧等。

    為什么需要JVM?

    Java語(yǔ)言使用Java虛擬機屏蔽了與具體平臺相關(guān)的信息,使得Java語(yǔ)言編譯程序只需生成在Java虛擬機上運行的目標代碼( 字節碼 ),就可以在多種平臺上不加修改地運行。

    Java文件必須先通過(guò)一個(gè)叫javac的編譯器,將代碼編譯成class文件,然后通過(guò)JVM把class文件解釋成各個(gè)平臺可以識別的機器碼,最終實(shí)現跨平臺運行代碼。

    JVM內存模型

    JVM內存模型可以分為兩個(gè)部分,如下圖所示,堆和方法區是所有線(xiàn)程共有的,而虛擬機棧,本地方法棧和程序計數器則是線(xiàn)程私有的。

    在JVM1.8中,圖中的 方法區為元數據區 ,下面展開(kāi)談一談這五個(gè)區域的作用。

    堆(Heap):

    在 Java 中,堆被劃分成兩個(gè)不同的區域:新生代 ( Young )、老年代 ( Old ),新生代 ( Young ) 又被劃分為三個(gè)區域:Eden、From Survivor、To Survivor。

    下圖中的Perm代表的是永久代,但是注意永久代并不屬于堆內存中的一部分,同時(shí)jdk1.8之后永久代也將被移除。

    堆是java虛擬機所管理的內存中最大的一塊內存區域,也是被各個(gè)線(xiàn)程共享的內存區域,該內存區域存放了對象實(shí)例及數組(但不是所有的對象實(shí)例都在堆中)。

    其大小通過(guò)-Xms(最小值)和-Xmx(最大值)參數設置(最大最小值都要小于1G),前者為啟動(dòng)時(shí)申請的最小內存,默認為操作系統物理內存的1/64,后者為JVM可申請的最大內存,默認為物理內存的1/4,默認當空余堆內存小于40%時(shí),JVM會(huì )增大堆內存到-Xmx指定的大小,可通過(guò)-XX:MinHeapFreeRation=來(lái)指定這個(gè)比列。

    當空余堆內存大于70%時(shí),JVM會(huì )減小堆內存的大小到-Xms指定的大小,可通過(guò)XX:MaxHeapFreeRation=來(lái)指定這個(gè)比列,當然為了避免在運行時(shí)頻繁調整Heap的大小,通常-Xms與-Xmx的值設成一樣。堆內存 = 新生代+老生代+持久代。

    在我們垃圾回收的時(shí)候,我們往往將堆內存分成新生代和老生代(大小比例1:2),新生代中由Eden和Survivor0,Survivor1組成,三者的比例是8:1:1,新生代的回收機制采用復制算法,在Minor GC的時(shí)候,我們都留一個(gè)存活區用來(lái)存放存活的對象,真正進(jìn)行的區域是Eden+其中一個(gè)存活區,當我們的對象時(shí)長(cháng)超過(guò)一定年齡時(shí)(默認15,可以通過(guò)參數設置),將會(huì )把對象放入老生代,當然大的對象會(huì )直接進(jìn)入老生代,老生代采用的回收算法是標記整理算法。

    方法區(Method Area)

    其實(shí)方法區是在JDK1.8以前的版本里存在的一塊內存區域,主要就是存放從class文件里加載進(jìn)來(lái)的類(lèi)的,而且常量池也是在這塊區域內的。

    但是在JDK1.8之后,這塊區域搖身一變,換了名字,叫做“Metaspace”,翻譯過(guò)來(lái)就是“元數據空間”的意思,當然它只是改了個(gè)名,實(shí)現的功能是沒(méi)變的。

    方法區(Method Area)與Java堆一樣,是各個(gè)線(xiàn)程共享的內存區域,它用于存儲已被虛擬機加載的類(lèi)型信息、常量、靜態(tài)變量、即時(shí)編譯器編譯后的代碼緩存等數據。

    1.類(lèi)型信息

    對每個(gè)加載的類(lèi)型(類(lèi)class、接口interface、枚舉enum、注解annotation),JVM必須在方法區中存儲以下類(lèi)型信息:

    ①這個(gè)類(lèi)型的完整有效名稱(chēng)(全名=包名.類(lèi)名)

    ②這個(gè)類(lèi)型直接父類(lèi)的完整有效名(對于interface或是java.lang.0bject,都沒(méi)有父類(lèi))

    ③這個(gè)類(lèi)型的修飾符(public, abstract,final的某個(gè)子集)

    ④這個(gè)類(lèi)型直接接口的一個(gè)有序列表

    2.域信息(Field)成員變量

    JVM必須在方法區中保存類(lèi)型的所有域的相關(guān)信息以及域的聲明順序。

    域的相關(guān)信息包括:域名稱(chēng)、域類(lèi)型、域修飾符(public, private,protected,static,final, volatile, transient的某個(gè)子集)

    3.方法(Method)信息

    JVM必須保存所有方法的以下信息,同域信息一樣包括聲明順序:

    方法名稱(chēng)

    方法的返回類(lèi)型(或void)·方法參數的數量和類(lèi)型(按順序)

    方法的修飾符(public, private,protected,static, final,synchronized,native,abstract的一個(gè)子集)

    方法的字節碼(bytecodes)、操作數棧、局部變量表及大小(abstract和native方法除外)

    文章“【Java基礎知識】什么是JVM?JVM內存模型由什么組成?(上)”已幫助

    更多內容

    >>本文地址:http://www.littlerockbway.com/zhuanye/2022/72418.html

    THE END  

    聲明:本站稿件版權均屬中公教育優(yōu)就業(yè)所有,未經(jīng)許可不得擅自轉載。

    1 您的年齡

    2 您的學(xué)歷

    3 您更想做哪個(gè)方向的工作?

    獲取測試結果
    • 大前端大前端
    • 大數據大數據
    • 互聯(lián)網(wǎng)營(yíng)銷(xiāo)互聯(lián)網(wǎng)營(yíng)銷(xiāo)
    • JavaJava
    • Linux云計算Linux
    • Python+人工智能Python
    • 嵌入式物聯(lián)網(wǎng)嵌入式
    • 全域電商運營(yíng)全域電商運營(yíng)
    • 軟件測試軟件測試
    • 室內設計室內設計
    • 平面設計平面設計
    • 電商設計電商設計
    • 網(wǎng)頁(yè)設計網(wǎng)頁(yè)設計
    • 全鏈路UI/UE設計UI設計
    • VR/AR游戲開(kāi)發(fā)VR/AR
    • 網(wǎng)絡(luò )安全網(wǎng)絡(luò )安全
    • 新媒體與短視頻運營(yíng)新媒體
    • 直播帶貨直播帶貨
    • 智能機器人軟件開(kāi)發(fā)智能機器人
     

    快速通道fast track

    近期開(kāi)班時(shí)間TIME

    两个人在线观看免费播放_国产精品天干天干_亚洲婷婷月色婷婷五月小蛇_男人的好小说全文免费阅读