《深入理解Java虛擬機》讀後總結
基於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