JVM高階特性和最佳實踐書籍總結
阿新 • • 發佈:2019-01-07
第一部分:Java記憶體區域與記憶體溢位異常
java程式在執行時,會把管理的記憶體劃分為:方法區,虛擬機器棧,本地方法棧,堆,程式計數器
1.程式計數器:是一塊較小的記憶體區域,它的作用可以看做當前執行緒所執行的位元組碼的行號指示器。在虛擬機器中,位元組碼直譯器工作時就是通過改變這個計數器的值來選取下一條需要執行的位元組碼指令。由於Java虛擬機器的多執行緒是通過執行緒輪流切換並分配處理器時間的方式。因此為了執行緒切換後能恢復到正確的執行位置,每條執行緒都需要一個獨立的程式計數器,各條執行緒之間的計數器互不影響嗎,獨立儲存。
2.虛擬機器棧:也是執行緒私有的,它的生命週期與執行緒相同。每一個方法被呼叫直至執行完成的過程,就對應著一個棧幀從虛擬機器棧中從入棧到出棧的過程(棧幀:是方法執行期的基礎資料結構)
3.本地方法棧:與虛擬機器棧所發揮的作用是非常相似的。區別就是虛擬機器棧為虛擬機器執行java方法服務。而本地方法棧執行的為虛擬機器使用到的native方法。
4.堆:是所有執行緒共享的一塊記憶體區域,在虛擬機器啟動時建立。唯一目地就是存放物件的例項,從記憶體回收的角度來看,由於收集器基本都是採用的分代收集演算法。
5.方法區:和Java堆一樣,是各個執行緒共享的記憶體區域。它用來儲存已被虛擬機器載入的類資訊,常量,靜態變數,訪問修飾符
6.訪問方式:控制代碼,指標;如果使用控制代碼 訪問,java堆中將會劃分一塊記憶體來作為控制代碼池,reference中儲存的就是物件的控制代碼地址,而控制代碼中包含了物件的例項資料和型別資料各自的地址資訊;如果使用指標訪問方式,java堆物件的佈局中就必須考慮如何放置訪問型別資料的相關資訊,reference中直接儲存的就是物件地址。