java在運行之後,就將內存控制權交給了java虛擬機。 java虛擬機在執行java程序的過程中會把它所管理的內存劃分爲若干不同的數據區域。 運行時的內存區分爲以下幾部分:
1. 程序計數器區域
程序計數器是一塊較小的內存空間,是爲當前線程所執行的字節碼的行號指示器。 由於多線程的存在,所以每個線程都需要有一個獨立的程序計數器。 各個線程之間的程序計數器互不影響,獨立存儲。 所以程序計數器的內存區域是線程私有的。
如果線程正在執行的是一個java方法,這個計數器記錄的是正在執行的虛擬機字節碼指令的地址。 如果執行的是native方法,則這個計數器爲空。
2. java虛擬機棧
描述的是java方法執行的內存調用模型, java虛擬機棧也是線程私有,生命週期和線程相同。
3.本地方法棧
是虛擬機使用到Native方法服務的內存棧, 線程私有的。
4. java堆
也被稱爲GC堆, 是虛擬機所管理的最大一塊內存,被所有線程共享,在虛擬機啓動時創建,目的是存放對象實例。如果堆中的內存不足,則會拋出OutOfMemory的異常。
java堆屬於線程共享的。
5.方法區
用於存儲已經被虛擬機加載的信息:包括常量,靜態變量,編譯後的代碼等數據。 也屬於線程共享的。 運行時的常量池Runtime Constant Pool也是方法區的一部分。
注: 此係列文章均參考學習 《深入理解Java虛擬機》- 周志明