《深入理解Java虛擬機》讀後總結(一)JVM內存模型

《深入理解Java虛擬機》讀後總結

(一)Sun HotSpot JVM內存模型

(二)Sun HotSpot JVM內存分配

(三)Sun HotSpot JVM內存監控


基於Sun HotSpot JVM


直接上圖:


從圖中看到,JVM內存分爲兩個主要區域,一個是所有線程共享的數據區,一個是線程隔離數據區(線程私有)


線程隔離數據區

程序計數器(Program Counter Register):
一小塊內存空間,單前線程所執行的字節碼行號指示器。字節碼解釋器工作時,通過改變這個計數器的值來選取下一條需要執行的字節碼指令,分支、循環、跳轉、異常處理、線程恢復等基礎功能都需要依賴這個計數器來完成。

JVM虛擬機棧(Java Virtual Machine Stacks):
Java方法執行內存模型,用於存儲局部變量,操作數棧,動態鏈接,方法出口等信息。是線程私有的。

本地方法棧(Native Method Stacks):
爲JVM用到的Native方法服務,Sun HotSpot 虛擬機把本地方法棧和JVM虛擬機棧合二爲一。是線程私有的。


線程共享的數據區

方法區(Method Area):
用於存儲JVM加載的類信息、常量、靜態變量、即使編譯器編譯後的代碼等數據。
運行時常量池(Runtime Constant Pool):
是方法區的一部分,用於存放編譯器生成的各種字面量和符號引用,這部分內容將在類加載後存放到方法取得運行時常量池中。具備動態性,用的比較多的就是String類的intern()方法。
JVM堆( Java Virtual Machine Heap):
存放所有對象實例的地方。
新生代,由Eden Space 和大小相同的兩塊Survivor組成
舊生待,存放經過多次垃圾回收仍然存活的對象

如圖:


直接內存(Direct Memory):
它並不是虛擬機運行時數據區的一部分,也不是JAVA虛擬機規範中定義的內存區域。在JDK1.4中加入了NIO類,引入了一種基於通道(Channel)於緩衝區(Buffer)的I/O方式,他可以使用Native函數庫直接分配堆外內存,然後通過一個存儲在JAVA堆裏面的DirectByteBuffer對象作爲這塊內存的引用進行操作。這樣能在一些場景中顯著提高性能,因爲避免了在JAVA堆中和Native堆中來回複製數據。





本文出自 “AUB” 博客,請務必保留此出處http://aubdiy.blog.51cto.com/2978849/1207517


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