jvm內存模型

       在學習JVM的時候,首先需要了解JVM的構成。然後在學習裏面的gc收集器算法、種類等。
jvm內存模型
藍色的爲線程共有,灰色的爲線程私有的。

       所謂線程私有,即在jvm運行的過程中,只有有一個線程使用,就會重新生成一套。而線程共有,則jvm一起共用,與線程的數量沒有關係。

程序計數器

       多線程時,當線程數超過CPU數量或CPU內核數量,線程之間就要根據時間片輪詢搶奪CPU時間資源。因此每個線程有要有一個獨立的程序計數器,記錄下一條要運行的指令。線程私有的內存區域。如果執行的是JAVA方法,計數器記錄正在執行的java字節碼地址,如果執行的是native方法,則計數器爲空。

虛擬機棧

       線程私有的,與線程在同一時間創建。管理JAVA方法執行的內存模型。每個方法執行時都會創建一個楨棧來存儲方法的的變量表、操作數棧、動態鏈接方法、返回值、返回地址等信息。棧的大小決定了方法調用的可達深度(遞歸多少層次,或嵌套調用多少層其他方法,-Xss參數可以設置虛擬機棧大小)。棧的大小可以是固定的,或者是動態擴展的。如果請求的棧深度大於最大可用深度,則拋出stackOverflowError;如果棧是可動態擴展的,但沒有內存空間支持擴展,則拋出OutofMemoryError。

本地方法區

       和虛擬機棧功能相似,但管理的不是JAVA方法,是本地方法,本地方法是用C實現的。

       線程共享的,存放所有對象實例和數組。垃圾回收的主要區域。可以分爲新生代和老年代(tenured)。
       新生代用於存放剛創建的對象以及年輕的對象,如果對象一直沒有被回收,生存得足夠長,老年對象就會被移入老年代。
       新生代又可進一步細分爲eden、survivorSpace0(s0,from space)、survivorSpace1(s1,to space)。剛創建的對象都放入eden,s0和s1都至少經過一次GC並倖存。如果倖存對象經過一定時間仍存在,則進入老年代(tenured)。

方法區

       線程共享的,用於存放被虛擬機加載的類的元數據信息:如常量、靜態變量、即時編譯器編譯後的代碼。也成爲永久代。如果hotspot虛擬機確定一個類的定義信息不會被使用,也會將其回收。回收的基本條件至少有:所有該類的實例被回收,而且裝載該類的ClassLoader被回收

JVM的類裝載流程

       分爲三個步驟,加載、鏈接、初始化,如圖
jvm的類加載機制

       小結:JVM的內部組成和各個部分的作用已經做了簡單介紹,接下來的文章會對其部分內容進行詳細的分析,敬請關注~~~

發佈了150 篇原創文章 · 獲贊 99 · 訪問量 71萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章