Java內存區域
Java虛擬機在執行Java程序的過程中會把它所管理的內存劃分為若干個不同的數據區域。不同的區域有不同的用途,它們的創建和銷毀的時間點也有不同,這個就是該篇文章所要講述的內容。
運行時數據區域
由所有線程共享的數據區域:方法區、Java堆。這些區域隨著虛擬機的啟動而生成。
線程隔離的數據區域:本地方法棧、Java虛擬機棧、程序計數器。這些區域依賴用戶線程的啟動和結束來建立和銷毀。
運行時數據區域.png
1、Java堆( Java Heap )
Java堆唯一的目的是存放對象實例和數組。同時,Java堆也是垃圾收集器管理的主要區域,很多時候也稱為 GC堆( Garbage Collected Heap )
2、方法區( Method Area )
方法區用于存儲已被虛擬機加載的類信息、常量、靜態變量、即時編譯器編譯后的代碼等數據。Java虛擬機規范將方法區描述為堆的一個邏輯部分,但是它卻有一個別名叫做 Non-Heap ,目的應該是與Java堆區分開來。
方法區中還有一個特殊的部分 —— 運行時常量池 。Class文件除了有類的版本、字段、方法、接口等描述信息外,還有一項信息是 常量池(Constant Pool Table) ,用于存放編譯期生成的各種字面量和符號引用,這部分內容在類加載后存放到方法區的運行時常量池中。
運行時常量池另外一重要特征是動態性,Java語言并不要求常量一定只能在編譯期間產生,運行期間也可能將新的常量放入池中,這種特性可以體現在 String 類的 intern() 方法
3、Java虛擬機棧( Java Virtual Machine Stacks )
虛擬機棧描述的Java方法執行的內存模型:每個方法被執行的時候都會同時創建一個 棧幀( Stack Frame ) 用于存儲局部變量表、操作棧、動態鏈接、方法出口等信息。每個方法被調用的過程對應著一個棧幀在虛擬機棧中從入棧到出棧的過程。
4、本地方法棧( Native Method Stacks )
本地方法棧與虛擬機棧功能相似,區別在于虛擬機棧執行Java方法(也就是字節碼)服務,而本地方法棧則是為虛擬機使用到的Native方法服務。一些虛擬機(例如:Sun HotSpot虛擬機)直接把本地方法棧與虛擬機棧合二為一。
5、程序計數器( Program Couter Register )
程序計數器可以看做是當前線程所執行的字節碼的行號指示器。所以在執行Java方法與Native方法的時候程序計數器的處理方式不一樣:
如果線程正在執行的是一個Java方法,這個計數器記錄的是正在執行的虛擬機字節碼的地址;如果正在執行的Native方法,這個計數器值則為空。
來自:http://www.jianshu.com/p/90a9647b02f2