區域劃分:
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中文網其他相關文章!