天天看點

JVM-記憶體模型JVM-記憶體模型一、JVM記憶體模型?總結

JVM-記憶體模型

提示:寫完文章後,目錄可以自動生成,如何生成可參考右邊的幫助文檔

文章目錄

  • JVM-記憶體模型
  • 一、JVM記憶體模型?
    • 1.1線程共享的
      • (1)堆
      • (2)方法區
        • 1 運作時常量池
      • (3)常用參數
      • (4)為什麼要元空間取代永久代呢?
    • 1.1線程私有
      • (1)虛拟機棧
      • (2)本地方法棧
      • (3)程式計數器
  • 總結

提示:以下是本篇文章正文内容,下面案例可供參考

一、JVM記憶體模型?

JVM-記憶體模型JVM-記憶體模型一、JVM記憶體模型?總結

1.1線程共享的

堆、方法區

(1)堆

  1. Head,java虛拟機管理記憶體區域最大的一塊區域,java堆是所有線程共享的一塊區域,此區域唯一目的就是存放執行個體對象,幾乎是所有執行個體對象以及數組都存在這裡。
  2. java堆是垃圾回收器管理的主要區域,是以被稱為GC堆。java堆還可以細分為:新生代和老年代:再細緻一點就是:Eden、S0、S1、tentired。大多數情況下,對象都會率先存在Eden區域配置設定,在一次新生代垃圾回收後,如果對象還活着則會進入S0或S1,并且對象的年齡會+1(Eden區->Survivor區後對象的初始年齡變為1),當預設年齡到達15之後,會被加到老年代。對象晉升的門檻值可以通過參數:-XX:MaxTenuringThreshold來設定。
    JVM-記憶體模型JVM-記憶體模型一、JVM記憶體模型?總結

(2)方法區

線程的共享區域,用于存儲已被虛拟機加載的類資訊、常量、靜态變量等。方法區也被稱為永久代,但是實質上永久代是方法區規範的實作。

1 運作時常量池

運作時常量池是方法區的一部分,Class檔案除了有類的版本、字段、方法、接口等描述資訊之外,還有常量池資訊。JDK1.7之後已經将常量池從方法區中移除出來,在堆中開辟了一塊區域存放運作時常量池。

(3)常用參數

  1. JDK1.8移除了永久代,取而代之的是元空間,元空間使用的是直接記憶體。與永久代很大不同的是,永久代如果不指定大小的話會随着類對象的建立,虛拟機會耗盡所有可用的記憶體。
-XX:MetaspaceSize=N//設定MetaspaceSize大小
-XX:MaxMetaspaceSize=N//最大值
           

(4)為什麼要元空間取代永久代呢?

整個永久代有一個JVM本身設定固定值大小上線,無法進行處理。元空間使用的是直接記憶體,受本機可用記憶體的限制,并不會記憶體溢出。當然可以設定元空間大小在一個區間。這隻是其中一個原因。。。

1.1線程私有

虛拟機棧、本地方法棧、程式計數器

(1)虛拟機棧

java虛拟機棧是由一個棧幀組成,每個棧幀中都擁有:局部變量表、操作數棧、動态連結清單、方法出口資訊等。java虛拟機棧是線程私有的。局部變量表中存放了編譯期存放的各種資料類型(Boolean、byte、char、short、int、float、long、double);對象引用可能是一個指向對象起始位址的引用位址,也可能是指向代表對象句柄或者對象相關的位置。

(2)本地方法棧

虛拟機棧和本地方法棧作用相似,差別在于虛拟機棧為虛拟機執行java方法服務,而本地方法棧則是為了虛拟機使用到的本地方法服務。

(3)程式計數器

位元組碼解析器工作時通過改變這個計數器的值來選取下一條需要執行的位元組碼指令、分支、循環、異常處理、線程恢複等功能都需要這個程式計數器完成。每條線程都需要有一個獨立的程式計數器,互相之間不影響,獨立存儲。有兩個作用:

  1. 位元組碼通過解析器改變程式計數器來依次讀取指令,進而實作代碼的流程控制,如:順序執行、選擇、循環、異常處理。
  2. 在多線程的情況下,程式計數器用于記錄目前線程執行的位置,進而當線程被切換回來的時候能夠知道該線程上次運作到那裡。

總結

例如:JVM記憶體模型的簡單介紹