1. 程式人生 > >java虛擬機器---記憶體區域

java虛擬機器---記憶體區域



1.程式計數器:

主要作用是記錄正在執行的虛擬機器位元組碼指令的地址,或者接下來要執行的下條指令地址,簡單的說就是記錄正在執行的程式碼地址或者將要執行程式碼的地址(這樣說不是很準確,只是好理解)

分支,迴圈,跳轉,異常處理,執行緒回覆等基礎功能都需要這個計數器來完成
有執行緒恢復功能說明不是共享的,每個執行緒都有一個程式計數器

2.java虛擬機器棧

程式猿最關心的"堆疊"中的棧指的就是虛擬機器棧
每個方法在執行的同時都會建立一個棧幀,用於存放區域性變量表,運算元棧,動態連結,方法出口等資訊.
其中,區域性變量表存放了: 儲存物件引用和基本資料型別還有指向一條位元組碼指令的地址


3.方法區:

也叫靜態區,儲存class資訊和static變數,final常量等資料,是各個執行緒共享的記憶體區域.

那方法區的東西什麼時候會被回收呢?最直觀的說法,就是程式結束時東西被回收!至於具體的可以看回收規則和演算法


4.執行時常量池:

它是方法區的一部分,class檔案中除了有類的版本,欄位,方法,介面等描述,資訊外,還有一項資訊是常量池,用於存放編譯期生成的各種字面量和符號引用.這部分內容將在類載入後進入方法區的執行時常量池中存放.
關於常量池,接觸得最多的就是String了,關於這裡的面試題還是比較多的.   檢視詳情


4.本地方法棧:

它與虛擬機器棧所發揮的作用是非常相似的,虛擬機器棧執行java方法(也就是位元組碼)服務,而本地方法棧則為虛擬機器使用到的native方法服務.
native方法指的是用其他語言(如c語言,java也可以)寫的操控偏硬體的程式


5.java堆

唯一的目的就是存放物件例項,幾乎所有的物件例項以及陣列都要在堆上分配(比如Class物件就存放在方法區).也因此是垃圾收集器管理的主要區域.
java堆可以分為:
1.新生代:存放比較新的物件.繼續可以分為:Eden空間,From survivor空間,To survivor空間.具體會在垃圾收集器中講解
2.老年代:存放老的物件


java堆可以處於物理上不連續的記憶體空間中,只有邏輯上連續的即可


6.直接記憶體

也稱為堆外記憶體.可以實現在java堆外分配記憶體,這裡物件的操作效率可以提高.




總結:

執行時資料區包括:堆,棧(虛擬機器棧和本地方法棧),方法區(包括常量池),程式計數器
執行緒私有的:程式計數器;java虛擬機器棧;本地方法棧;
執行緒共享的:java堆;方法區;


對程式猿來說,堆疊是最關心的,堆中存放物件,棧中存放物件的引用.使用物件時,通過棧中的引用找到物件進而使用






參考文獻:<<深入理解java虛擬機器>>周志明