1. 程式人生 > >java運行時數據區分析

java運行時數據區分析

long ack 方法區 sha tps 老生代 oss .cn public

目錄

  • java運行時數據區分析
    • 概覽
    • 方法區
      • 全局字符串池
      • Class文件常量池
      • 運行時常量池
      • 總結
    • Java虛擬機棧
    • 本地方法棧
    • 程序計數器
    • 參考博客

java運行時數據區分析

概覽

技術分享圖片

是Java虛擬機所管理的內存中最大的一塊。由所有線程共享,在虛擬機啟動時創建。
堆區唯一目的就是存放對象實例。

堆中可細分為新生代和老生代(垃圾回收期主要回收的區域),新生代又可細分為Eden空間,From Survivor空間、To Survivor空間。

方法區

存儲已被虛擬機加載的類信息、常量、靜態變量、即時編譯器編譯後的代碼等數據。

全局字符串池

全局字符串池裏的內容是在類加載完成,經過驗證,準備階段之後在堆中生成字符串對象實例,然後將該字符串對象實例的引用值存到string pool中(記住:string pool中存的是引用值而不是具體的實例對象,具體的實例對象是在堆中開辟的一塊空間存放的。)。 在HotSpot VM裏實現的string pool功能的是一個StringTable類,它是一個哈希表,裏面存的是駐留字符串(也就是我們常說的用雙引號括起來的)的引用(而不是駐留字符串實例本身),也就是說在堆中的某些字符串實例被這個StringTable引用之後就等同被賦予了”駐留字符串”的身份。這個StringTable在每個HotSpot VM的實例只有一份,被所有的類共享。

Class文件常量池

技術分享圖片
class文件除了包含類的版本、字段、方法、接口等描述信息外,還有一項信息就是常量池(constant pool table),用於存放編譯器生成的各種字面量(Literal)和符號引用(Symbolic References)。
字面量就是常量的概念,如文本字符串、被聲明為final的常量值的。
符號引用是一組符號來描述所引用的目標,符號引用可以是任何形式的字面量。
常量池的每一項常量都是一個表,一共有如下表所示的11種各不相同的表結構數據,這每個表開始的第一位都是一個字節的標誌位
技術分享圖片
技術分享圖片

運行時常量池

jvm在執行某個類的時候,必須經過加載、連接、初始化,而連接又包括驗證、準備、解析三個階段。而當類加載到內存中後,jvm就會將class常量池中的內容存放到運行時常量池中,由此可知,運行時常量池也是每個類都有一個。在上面我也說了,class常量池中存的是字面量和符號引用,也就是說他們存的並不是對象的實例,而是對象的符號引用值。而經過解析(resolve)之後,也就是把符號引用替換為直接引用,解析的過程會去查詢全局字符串池,也就是我們上面所說的StringTable,以保證運行時常量池所引用的字符串與全局字符串池中所引用的是一致的。

總結

  1. 全局常量池在每個JVM中只有一份,存放的是字符串常量的引用值
  2. class常量池是在編譯的時候每個class都有的在編譯階段,存放的是常量的符號引用
  3. 運行時常量池是在類加載完成之後,將每個class常量池中的符號引用值轉存到運行時常量池中,也就是說,每個class都有一個運行時常量池,類在解析之後,將符號引用替換成直接引用,與全局常量池中的引用值保持一致

Java虛擬機棧

描述Java方法執行的內存模型:每個方法在執行的同時都會創建一個棧幀(Stack Frame)用於存儲局部變量表、操作數棧、動態鏈接、方法出口等信息。一個方法對應一個棧幀。
局部變量表存放了各種基本類型,對象引用和returnAddress類型(指向一條字節碼指令地址)。其中64位長度long 和 double占兩個局部變量空間,其他只占一個。

public int myCalculate() {
   int a = 1;
    int b = 2;
    int c = 3;
    int d = 4;
    int result = (a + b - c) * d;
    return result;
}

局部變量表
技術分享圖片
操作數棧
技術分享圖片

本地方法棧

和java虛擬機棧類似,不同的是其為Native方法服務

程序計數器

是當前線程所執行的字節碼的行號指示器,每個線程都有一個獨立的程序計數器。

參考博客

字符串常量池、class常量池和運行時常量池:https://blog.csdn.net/qq_26222859/article/details/73135660

java運行時數據區分析