jvm 運行時數據區域(讀書筆記)

java虛擬機運行是區域主要分爲五個

  • 程序計數器
  • 虛擬機棧
  • 本地方法棧
  • 方法區

1.程序計數器

  程序計數器是一塊比較小的內存空間。可以看作是當前現場所執行的字節碼的行號指示器。每條線程都有一個獨立的程序計數器,在各線程之間是獨立存儲的,這類內存區域爲“線程私有”內存。如果是一個Native方法這個計數器值爲空(Undefined)。

2.java虛擬機棧

  虛擬機棧也是線程私有的,它的生命週期和線程相同。每個java方法在執行的時候都會創建一個棧幀。用於儲存局部變量表,操作數棧,動態鏈接,方法出口信息等。
  局部變量表存放了編譯期可預知的各種基本數據類型,對象引用,returnAddress類型。
  局部變量表所需要的內存空間在編譯期間完成分配,當進入一個方法時,這個方法需要在幀中分配多大的局部空間是完全確定的,在方法運行期間不會改變局部變量的大小。

3.本地方法棧

  本地方法棧和虛擬機棧功能基本相同,只是針對的對象不同。它針對的是虛擬機使用到的Native方法服務。在虛擬機規範中對它沒有強制規定,可以把它合併到虛擬機棧中。

4.堆

  堆是java虛擬機所管理的最大的一塊內存區域。java堆是本所有的線程共享的一塊內存區域,在虛擬機啓動時創建。這塊內存區域唯一目的就是存放對象實例,幾乎所有的對象實例都創建在這裏。
  java堆是垃圾收集器的主要管理區域,從垃圾收集器基本採用分代收集算法來區分堆區域,堆區域還可以細分爲:新生代和老年代;再細緻一點有分Eden空間、From Survivor空間、To Survivor空間等。從內存分配的角度來看,線程共享的java堆中可能劃分出多個線程私有的分配緩衝區(Thread Local Allocation Buffer,TLAB)

5.方法區

  方法區也是各個線程共享的區域,它用於儲存已經被虛擬機加載的類的信息、常量、靜態變量、即時編譯器編譯後的代碼數據等。很多人也把這個區域叫永久代。

6.運行時常量

  運行時常量池是方法區的一部分。clas文件中除了有類似的版本、字段、方法、接口等信息描述外,還有一項信息是常量池,用於存放編譯期產生的各種字面量和符號引用,這部分在類加載後進入方法區的運行時常量池中存放,還會把翻譯出來的直接引用也存儲在運行時常量池中。

7.直接內存

  直接內存不是虛擬機運行時數據的一部分,也不在java虛擬機規範中定義的內存區域。在JDK1.4中加入了NIO類,引入了基於通道與緩衝區的I/O方式,它可以使用Native函數庫直接分配堆外內存,然後通過一個存儲在java中的DirectByteBuffer對象作爲這塊內容的引用操作。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章