1. 程式人生 > >JVM歷險記第一章:初到記憶體

JVM歷險記第一章:初到記憶體

我是一個初次來到記憶體的資料,我被java程式輸送到此。來到記憶體後我很迷茫,因為不知道應該到哪去,看起來好像有五個部落。

PC暫存器部落:

它說它只接受它親戚執行緒的資料,沒有私下關係根本不讓進。人家的名號大:“程式計數暫存器”,每個執行緒好像都有一個PC暫存器部落,突然好羨慕人家。畢竟可以劃到屬於自己的地方,每個PC暫存器好像門頭的地址在不停的變換著,據聽說它這個數字就是它正在執行的方法地址。有時候突然門頭地址消失了。小道訊息,說這是因為執行到本地方法了。多個PC暫存器部落不停的繁忙著,多個執行緒這不停的執行、掛起。現在想想又不羨慕了,畢竟加班嚴重啊。辛虧沒去啊。

JAVA虛擬機器棧部落:

TMD又是一個靠關係才能進的部落,而且又是和執行緒有關係,不過好像這個部落貌似不太穩定啊,一會出現一會消失,隨著執行緒而來隨著執行緒而去。

如果說暫存器部落太簡單,只能看到一個門牌號,那JAVA虛擬機器棧部落的機構設定就有點複雜了。首先設定了棧幀機構,這個機構專門處理臨時資料。這個機構隨著方法的建立而生,隨著方法結束而死。每一個棧幀機構都有著自己的區域性變量表以及運算元棧以及對當前類的執行時常量池的引用。它還負責處理方法返回值、動態連結以及異常分派的任務。這樣一看棧幀真是不簡單。

再看看棧幀中的小弟們,頭號小弟叫區域性變量表,它是一個方法區域性變數的列表,其實它比虛擬機器棧部落出生還早些,聽說在class出生的時候它就在了,看來是是個實名的低頭蛇了。

可以將它理解為一個物件陣列,而裡面按照索引0到length-1分別對應於每一個區域性變數

,特別的,如果是例項方法的區域性變量表,第0個區域性變數會是一個指向當前例項的引用,也就是this關鍵字,其餘的區域性變數則從索引1開始。看到這想想地頭蛇也是不好當的啊。。。

又看到另一個不起眼的小弟叫運算元棧,名字真是難聽。它是一個後進先出(LIFO)棧,而它的長度也是在編譯時期就寫入了class檔案當中,是固定的。作用就是提供位元組碼指令操作變數計算的空間,比如簡單的,對於int a=9這句話來說,就需要先將9壓入運算元棧,再將9賦給a這個變數。

堆部落:

這個部落好像我可以進,而且貌似這佔了好大一塊的空間,這裡儲存了好多物件和陣列物件。而且還有自建的護衛隊,貌似為了保證人口在2300w左右,所以組建了垃圾回收隊。專門清理部落中垃圾資料佔用的地方。

方法區部落:

這個地方其實堆的vip區,因為聽說這邊的資料不保證垃圾回收隊會過來巡邏,所以它是執行時常量池、欄位資訊、方法資訊、構造方法與普通函式的位元組碼內容以及一些特殊方法的樂園。

本地方法棧部落:

這個部落神祕了,因為出現與消失可以不定的,幸運的可以看見它,它用來支援native方法的執行。

如果JAVA虛擬機器不依賴於本地方法棧,而且JAVA虛擬機器也不支援native方法,則不需要本地方法棧。而如果需要的話,則本地方法棧也是隨每一個執行緒的啟動而建立的。

看到他們這個領地除了PC暫存器部落不受管制,剩餘的都受一個叫程式設計師的人管制這,讓他們佔地多少,劃分佔比多少都可以以命令的形式下達。。。這樣看程式設計師才是老大啊!!!