《深刻理解Java虛擬機》第2章讀書筆記微信
Java虛擬機在執行Java程序的過程當中會把它所管理的內存劃分爲若干個不一樣的區域。這些區域都有各自的用途,以及建立和銷燬的時間,有的區域隨着虛擬機進程的啓動而存在,有些區域則依賴用戶線程的啓動和結束而創建和銷燬。數據結構
下圖爲《Java虛擬機規範》規定的幾個區域,不一樣虛擬機實現起來略有區別:多線程
保存線程當前工做狀態。函數
程序計數器(Program Counter Register)是一塊較小的內存空間,它能夠看作是當前線程所執行的字節碼的行號指示器。在虛擬機的概念模型裏(僅是概念模型,各類虛擬機可能會經過一些更高效的方式去實現),字節碼解釋器工做時就是經過改變這個計數器的值來選取下一條須要執行的字節碼指令,分支、循環、跳轉、異常處理、線程恢復等基礎功能都須要依賴這個計數器來完成。線程
因爲Java虛擬機的多線程是經過線程輪流切換並分配處理器執行時間的方式來實現的,在任何一個肯定的時刻,一個處理器(對於多核處理器來講是一個內核)都只會執行一條線程中的指令。所以,爲了線程切換後能恢復到正確的執行位置,每條線程都須要有一個獨立的程序計數器,各線程之間計數器互不影響,獨立存儲,咱們稱這類內存區域爲「線程私有」的內存。code
若是線程正在執行的是一個Java方法,這個計數器記錄的是正在執行的虛擬機字節碼指令的地址。cdn
若是正在執行的是Native方法,這個計數器值則爲空(Undefined)。對象
此內存區域是惟一一個在Java虛擬機規範中沒有規定任何OutOfMemoryError
狀況的區域。blog
每一個方法執行時都會建立一個棧幀,棧幀裏有個局部變量表存儲着基本數據類型和對象引用。遞歸
Java虛擬機棧也是線程私有的,它的生命週期與線程相同。
虛擬機棧描述的是Java方法執行的內存模型:每一個方法在執行的同時都會建立一個棧幀用於存儲局部變量表、操做數棧、動態連接、方法出口等信息。每個方法從調用直至執行完成的過程,就對應着一個棧幀在虛擬機棧中入棧到出棧的過程。
Java內存常常被粗糙的分爲堆內存和棧內存,其中棧內存就是指的虛擬機棧。
局部變量表存放了編譯期可知的各類基本數據類型、對象引用和returnAdress類型。
其中64位的 long 和 double 類型的數據會佔用2個局部變量空間,其他的數據類型只佔用1個。
局部變量表所需的內存空間在編譯期間內完成分配,當進入一個方法時,這個方法須要在幀中分配多大的局部變量空間是徹底肯定的,在方法運行期間不會改變局部變量表的大小。
若是請求的棧深度大於虛擬機所容許的深度(好比無限深度的遞歸),將拋出 StackOverflowError
異常;若是虛擬機棧能夠動態擴展(大部分虛擬機均可以),若是沒法申請到足夠的內存,就會拋出 OutOfMemoryError
異常。
與虛擬機棧類似,只是爲Native方法服務。
虛擬機棧爲虛擬機執行Java方法(也就是字節碼)服務。本地方法棧則爲虛擬機使用到的Native方法服務。
在虛擬機規範中對本地方法棧中方法使用的語言、使用方式與數據結構沒有強制規定,虛擬機能夠自由實現它,甚至能夠把本地方法棧和虛擬機棧合二爲一。
和Java虛擬機棧同樣,也會拋出StackOverflowError
和 OutOfMemoryError
異常。
存放對象實例,GC主要管理的區域。
Java堆是Java虛擬機所管理的內存中最大的一塊。Java堆是被全部線程共享的一塊內存區域,在虛擬機啓動時建立。此內存區域的惟一目的就是存放對象實例。
Java堆是垃圾收集器管理的主要區域,也被稱爲「GC堆」。
Java堆能夠處於物理上不連續的內存空間中,只要邏輯上是連續的便可,就像咱們的磁盤空間同樣。堆的內存大小是可擴展的(經過-Xmx 和 -Xms)。
若是在堆中沒有內存完成實例分配,而且堆也沒法再擴展時,將拋出 OutOfMemoryError
異常
存儲類信息,常量,靜態變量,JIT代碼。JDK1.8中HotSpot用元空間(MetaSpace)取代永久代。
方法區是各個線程共享的內存區域,它用於存儲已被虛擬機加載的類信息、常量、靜態變量、即時編譯器編譯後的代碼等數據(不容易發生變化的數據)。
方法區也被稱爲永久代(諢名),由於這個區域能夠選擇不實現垃圾收集。但大部分虛擬機仍是會實現垃圾收集,只是回收的條件極爲苛刻。
當方法區沒法知足內存分配需求時,將拋出 OutOfMemoryError
異常。
緩衝區Buffer使用的堆外內存,它可使用native函數庫直接分配堆外內存,而後經過一個存儲在Java堆中的DirectByteBuffer對象做爲這塊內存的引用進行操做。
本文介紹了Java虛擬機內存中的幾個區域,分別介紹了不一樣區域各自的做用和特色。
線程隔離的區域:
線程共享的區域:
本文首發於個人我的博客 chaohang.top
做者張小超
轉載請註明出處
歡迎關注個人微信公衆號 【超超不會飛】,獲取第一時間的更新。