通過一系列文章對有關java虛擬機的知識點一一列出,也是給自己的一個總結
java虛擬機(一)java 內存區域
java虛擬機(二)JAVA虛擬機中的垃圾收集算法
java虛擬機(三)垃圾收集器
java虛擬機(四)垃圾回收分代內存分配策略
java虛擬機(一)java 內存區域劃分
JAVA虛擬機在執行java程序的過程中會把它管理的內存劃分爲若干個不同的數據區域,這些區域都有各自的用途,以及創建和銷燬的時間,java 虛擬機所管理的內存將會包括一下幾個運行時數據區域
程序計數器
- 是一塊非常小的內存空間
- 可以看做時當前線程所執行的字節碼的行號指示器
應用
- 在虛擬機的概念模型裏,字節碼解釋器工作時就是通過改變這個計數器的值來選取下一條需要執行的字節碼指令,分支、循環、跳轉、異常處理、線程恢復等基礎功能都需要依賴這個計數器來完成
- 爲了線程切換後能恢復到正常的執行位置,每條線程都需要有一個獨立的程序計數器,各個線程之間計數器互不干擾,獨立存儲
線程區域
線程私有的
java虛擬機棧
- 虛擬機棧描述的是java方法執行的內存模型
- 每個方法在執行的同時都會創建一個棧幀,用於存儲局部變量表、操作數棧、動態鏈接、方法出口等信息
- 每一個方法從調用直到執行完成的過程,就對應着一個棧幀在虛擬機棧中入棧到出棧的過程
棧 = 虛擬機棧 = 虛擬機棧中局部變量表部分
局部變量表:
- 存放了編譯期可知的各種基本數據類型(boolean byte char short int float long double)、對象引用和returnAddress類型(指向了一條自己碼指令的地址)
- long 和 double 是64位長度的類型,數據會佔用2個局部變量空間,其餘的數據類型只佔用一個
- 局部變量表所需的內存空間在編譯期間完成分配,當進入一個方法時,這個方法需要在幀中分配多大的局變量空間是完全確定的,在方法運行期間不會改變局部變量表的大小
區域異常
- StackOverflowError:如果線程請求的棧深度大於虛擬機所允許的深度,將會拋出此異常
- OutOfMemoryError:如果虛擬機棧擴展時無法申請到足夠的內存,就會拋出此異常
線程區域
線程私有的
本地方法棧
與java虛擬機棧的作用相似
- java虛擬機棧爲虛擬機執行java方法(字節碼)服務
- 本地方法棧是爲虛擬機使用到的Native方法服務
區域異常
- StackOverflowError
- OutOfMemoryError
線程區域
線程私有的
java堆
- 此內存區域的唯一目的就是存放對象實例,幾乎所有的對象實例都在這裏分配內存
- 是垃圾收集器管理的主要區域
區域異常
- OutOfMemoryError :如果堆中沒有內存完成實例分配,並且堆也無法再擴展時,將會拋出OutOfMemoryError異常
線程區域
線程共享的內存區域
方法區
- 用於存儲已被虛擬機加載的類信息,常量,靜態變量,即時編譯器編譯後的代碼等數據
- 一部分爲運行時常量池
線程區域
方法區與Java堆一樣,是線程共享的內存區域
區域異常
- OutOfMemoryError
運行時常量池
- 運行時常量池是方法區的一部分
- 用於存放編譯期生成的各種字面量和符號引用,這部分內容將在類加載後進入方法區的運行時常量池
- 並非預置的常量池內容才能進入方法區運行時常量池,運行期間也可能將新的常量放入池中,如String類的intern()
線程區域
線程共享的內存區域
區域異常
- OutOfMemoryError