Java運行時數據區域

Java運行時數據區域

1.Java虛擬機運行時數據區圖

在這裏插入圖片描述

2.各個區域的解釋

2.1程序計數器

    程序計數器(Program Counter Register)是一塊較小的內存空間,它可以看做是當前線程所執行的字節碼的行號指示器。字節碼解釋器工作時就是通過改變這個計數器的值來選取下一條需要執行的字節碼指令。每條線程都需要有一個獨立的程序計數器,各個線程之間計數器互不影響,獨立存儲,爲“線程私有”的內存。

2.2 Java虛擬機棧

    Java虛擬機棧(Java Virtual Machine Stacks)與程序計數器一樣,也是線程私有的,它的生命週期與線程相同。每個方法在執行的同時都會創建一個棧幀(Stack Frame)用於存儲局部變量表、操作數棧、動態鏈接、方法口等信息。
    局部變量表存放了編譯期可知的各種基本數據類型、對象引用和returnAddress類型。局部變量表所需的內存空間在編譯期間完成分配,在方法運行期間不會改變局部變量表的大小。
    對象引用:不等同於對象本身,可能是指向對象起始地址的引用指針,也可能是指向一個代表對象的句柄或者與此對象相關的位置。
    returnAddress類型:指向了一條字節碼指令的地址(該指令可能返回一個引用對象)。

2.3本地方法棧

   本地方法棧(Native Method Stack)爲Java虛擬機使用到的Native方法服務。

2.4Java堆

    Java堆(Java Heap)是Java虛擬機所管理的內存中最大的一塊。Java堆是被所有線程共享的一塊區域,在虛擬機啓動時創建。幾乎所有的對象實例都在這裏分配內存空間(所有的對象實例以及數組都要在堆上分配)。Java堆是垃圾收集器管理的主要區域,因此也被稱爲“GC堆”(Garbage Collected Heap)。

2.5方法區

    方法區(Method Area)與Java堆一樣,是各個線程共享的內存區域,它用於存儲已被虛擬機加載的類信息、常量、靜態變量、即時編譯器編譯後的代碼數據。
    雖然Java虛擬機規範把方法區描述爲堆的一個邏輯部分,但是它卻有一個別名叫做Non-Heap(非堆)。

2.6 運行時常量池

    運行時常量池(Runtime Constant Pool)是方法區的一部分。Class文件中除了有類的版本、字段、方法、接口等描述信息外,還有一項信息是常量池(Constant Pool Table),用於存放編譯器生成的各種字面量符號引用,這部分內容將在類架子啊後進入方法區的運行時常量池中存放。
    一般來說,除了保存Class文件中描述的符號引用外,還會把翻譯出來的直接引用也存儲在運行時常量池中。
    運行時常量池相對於Class文件常量池的另外一個重要特徵是具備動態性。Java語言並不要求常量一定只有編譯期才能產生,也就是並非預置入Class文件中常量池的內容才能進入方法區運行時常量池,運行期間也可能將新的常量放入池中,這種特性被利用的比較多的是String類的intern方法。

在這裏插入圖片描述

2.7 直接內存

    直接內存(Direct Memory)並不是虛擬機運行時數據區的一部分,也不是Java虛擬機規範中定義的內存區域。
    在jdk1.4中新加入了NIO(New Input/Output)類,引入了一種基於通道(Channel)與緩衝(Buffer)的I/O方式,它可以使用Native函數庫直接分配堆外內存,然後通過一個存儲在Java堆中的DirectByteBuffer對象作爲這塊內存的引用進行操作。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章