Java運行時數據區域


1、程序計數器(program counter register)

定義:一塊較小的內存空間,可以看做是當前線程所執行的字節碼的行號指示器。

線程:私有

異常:無

2、Java虛擬機棧(java virtual machine stacks)

定義:Java虛擬機棧描述的是Java方法執行的內存模型:每個方法在執行的同時都會創建一個棧幀(stack frame)用於存儲 局部變量表、操作數棧、動態鏈接、方法出口等信息。每一個方法從調用至執行完成的過程,就對應着一個棧幀在虛擬機棧中入棧到出棧的過程。

存儲:八種基本數據類型(boolean、byte、char、short、int、long、float、double)、對象引用(引用指針)和returnAddress(指向一條字節碼的指令地址)

線程:私有

異常:如果線程請求的棧深度大於虛擬機所允許的深度,拋出StackOverflowError;如果虛擬機棧動態擴展時無法申請到更多的內存,拋出OutOfMemoryError。

3、本地方法棧(Native Method Stack)

定義:與虛擬機棧作用非常相似,不同的是虛擬機棧執行的是Java方法(字節碼),本地方法棧爲虛擬機使用到的native方法服務。注:本地方法棧和虛擬機棧可以合併,例如Sun Hotspot虛擬機。

4、Java堆(Java heap)

定義:Java堆是虛擬機所管理的內存中最大的一塊。被所有線程共享的一塊內存區域,在虛擬機啓動時創建。它是GC的主要區域。

存儲:對象實例

線程:共享

異常:OutOfMemoryError

5、方法區(Method area)

定義:與java堆一樣,是各個線程共享的區域。別名“Non-heap”(非堆),目的是與java堆分開。

注:本質上方法區不等價於“永久代”。因爲Hotspot設計團隊將GC分代收集擴展至方法區,使用永久代實現了方法區,其他虛擬機不存在永久代的概念,如(BEA JRockit、IBM J9)等。

JDK1.7的HotSpot中已經將字符串常量池在永久代中移出。

存儲:虛擬機加載的類信息、常量、靜態變量、即時編譯器編譯後的代碼等數據。

線程:共享

6、運行時常量池(Runtime Constant Pool)

定義:是方法區的一部分,用於存放編譯期生成的各種字面變量和符號引用,這些是在類加載後進入方法區的運行時常量池中存放。

存儲:字面變量和符號引用

線程:共享

異常:OutOfMemoryError

7、直接內存(Direct Memory)

不是虛擬機運行時數據區域的一部分,也不是java虛擬機規範中定義的內存區域。

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