首頁  >  文章  >  Java  >  JVM進階特性--java記憶體結構區域介紹

JVM進階特性--java記憶體結構區域介紹

巴扎黑
巴扎黑原創
2017-06-26 10:21:501671瀏覽

區域劃分:

  java虛擬機器在執行程式的過程中,將記憶體分為幾個功能不同的區域,如下圖:

 

       

#  此圖列出了記憶分割的各個區域,其中

  執行緒私有的:程式計數器、虛擬機器堆疊、本機方法堆疊

  執行緒共享的:堆疊、方法區

下面,逐一介紹各區域的功能及作用

 

  程序計數器:

    1.程式計數器主要用來指向正在執行的字節碼行號,每個執行緒都有一個單獨的程式計數器,互不共享,透過改變這個計數器指向的字節碼行號來執行程式

    2.循環、跳轉、異常處理等機制都是依賴這個計數器來完成的

    3.若程式執行的是java程式,他指向的是正在執行的字節碼,若執行的是native方法,則他的值為空

 

  java虛擬機堆疊:

    1.虛擬機棧是線程私有的,每個方法在執行時都會創建一個棧幀,用於存儲本地變量表、方法出口、動態鏈接、操作數棧等信息,

    2.每個方法的執行的過程都是一個虛擬機棧從入棧到出棧的過程

      許多人常說java內存分為堆內存和棧,其中堆疊記憶體所指的就是這個虛擬機器棧

    上面提到本地變數表,這裡主要存放著編譯器可知的基本資料型別(int\byte\char\long等)、物件參考、returnaddress類型

    擴展:

       物件引用(reference):不是物件本身,可能是指向物件所在的起始位址的參考指標,可能是代表物件的句柄或相關的其他位置

       returnaddress:不是java api中的類型,無法讓我們所調用,他指向的是一條字節碼指令的地址

 

  ##本地方法堆疊

    類似虛擬機棧,是為native方法服務的記憶體

 

  

Java堆  

Java堆



    堆內存是線程共享內存,他的主要目的是用來存儲對象,也是垃圾收集器管理的主要區域

    Java堆分為新生代和老年代,具體有關於垃圾回收機制會在後續文章中介紹  

方法區(也成為非堆)

也是記憶體共享內存,用來儲存載入的類別資訊、常數、靜態變數、即時編譯器編譯後的程式碼等

    運行時常數池:是方法區的一部分,用於儲存編譯器產生的各種字面量與符號引用   

#直接記憶體:

    不是虛擬機器執行時間資料區一部分,不屬於JVM所管理的記憶體

    在NIO中可以使用native函數直接分配直接內存,並且透過java中的DirectByteBuffer物件作為這塊記憶體的參考來操作

    : 優點複製的步驟,效率更快

    缺點:不易控制,容易造成記憶體洩漏

###  ###### ####

以上是JVM進階特性--java記憶體結構區域介紹的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn