天天看點

Java 虛拟機(JVM) -- 記憶體管理 (一)

=-= 先撤,去同濟經管學院門口吃卷餅去,炒雞好吃,有空再寫

記憶體管理的角度,進一步探索 Java 虛拟機(JVM)。

通常可以把 JVM 記憶體區域分為下面幾個方面,其中,有的區域是以線程為機關,而有的區域則是整個 JVM 程序唯一的。

程式計數器(PC,Program Counter Register)

在 ​

​JVM​

​​ 規範中,每個線程都有它自己的程式計數器,并且任何時間一個線程都隻有一個方法在執行,也就是所謂的目前方法。程式計數器會存儲目前線程正在執行的 Java 方法的 ​

​JVM​

​ 指令位址;或者,如果是在執行本地方法,則是未指定值(undefined)。

作用: 目前線程所執行的位元組碼的行号訓示器

  • 位元組碼解釋器工作時通過改變它的值來選取下一條需要執行的位元組碼指令
  • 分支、循環、跳轉、異常處理和線程恢複都依賴于它

java 虛拟機棧(Java Virtual Machine Stack)

早期也叫 Java 棧。每個線程在建立時都會建立一個虛拟機棧,其内部儲存一個個的棧幀(Stack Frame),對應着一次次的 Java 方法調用。

前面談到計數器,提到了目前方法,同理,在一個時間點,對應的隻會有一個活動的棧幀,通常叫作目前幀,方法所在的類叫作目前類。如果在該方法中調用了其他方法,對應的新的棧幀會被建立出來,成為新的目前幀,一直到它傳回結果或者執行結束。JVM 直接對 Java 棧的操作隻有兩個,就是對棧幀的壓棧和出棧。

棧幀中存儲着局部變量表、操作數(operand)棧、動态連結、方法正常退出或者異常退出的定義等。

其中局部變量表用于存放8種基本資料類型(boolean,byte,char,short,int,float,long,double)和reference類型.

本地方法棧(Native Method Stack)

它和 Java 虛拟機棧是非常相似的,支援對本地方法的調用,也是每個線程都會建立一個。在 Oracle Hotspot JVM 中,本地方法棧和 Java 虛拟機棧是在同一塊兒區域,這完全取決于技術實作的決定,并未在規範中強制。

與虛拟機棧的作用非常相似.其差別是虛拟機棧執行 ​

​Java​

​​ 方法服務,而本地方法棧則為虛拟機使用到的 ​

​Native​

​ 方法服務

堆(Heap)

配置設定所有的對象執行個體和數組

Java 記憶體管理的核心區域,用來放置 Java 的對象執行個體。幾乎所有建立的 Java 對象執行個體都是被直接配置設定在堆上。堆被所有的線程共享,在虛拟機啟動時,我們指定的“Xmx”之類參數就是用來指定最大堆空間等名額。

理所當然,堆也是垃圾收集器重點照顧的區域,是以堆内空間還會被不同的垃圾收集器進行進一步的細分,最有名的就是新生代、老年代的劃分。

方法區

用于存儲已被虛拟機加載的類資訊(Class)、常量(final修飾)、靜态變量(static)和即時編譯器編譯後的代碼(code)

這也是所有線程共享的一塊記憶體區域,用于存儲所謂的元(Meta)資料,例如類結構資訊,以及對應的運作時常量池、字段、方法代碼等。

運作時常量池(Run-Time Constant Pool)

用于存放編譯期生成的各種字面量和符号引用(在以後介紹Class結構會講到),在類加載後存放到方法區的運作時常量池中

記憶體結構圖

後續可了解

  • ​​《深入了解Java虛拟機》學習小記一之自動記憶體管理機制(一)​​