一直從事JAVA開發,每天和JVM打交道,仔細想一想對JVM還真的不是特別瞭解,實在是不該該.週六看了許多資料,也算有點心得,記錄一下。測試
JVM內存模型分爲5個區域:方法區,堆,虛擬機棧,本地方法棧,程序計數器.對象
方法區:屬於共享區域,存放已經被虛擬機加載過的類信息、常量、靜態變量、即時編譯器編譯後的代碼.須要額外注意的是平時常說的常量池就是在這個區域,全稱爲運行時常量池,存放編譯好的字面量和符號引用,有時候會利用String的intern()在運行時,加載進去.對於方法區來講,若是申請不到內存,就會拋出內存溢出(OutOfMemoryError)錯誤.內存
堆:屬於共享區域,最常常打交道的區域,也是GC主要管理區域,主要存儲對象實例,同理,也會拋出內存溢出(OutOfMemoryError)錯誤.開發
虛擬機棧:屬於私有區域,常說的棧,存儲局部變量表、操做數棧、動態連接方法、返回值、返回地址等信息.內部結構是棧裏全是棧幀,會出現兩種錯誤,第一種StackOverFlowError,是由於棧長度到頂,再放入內容,致使棧溢出,通常產生此狀況是由於局部變量多,字節大致使,因此能夠增長棧的深度,經過-Xss來進行設置每一個棧的大小,默認爲1M.還有一種錯誤是內存溢出(OutOfMemoryError),申請的內存空間超過最大.編譯器
本地方法棧:相似虛擬機棧,只不過與虛擬機用到的Native方法相關.虛擬機
程序計數器:屬於私有區域,存儲字節碼指令,如代碼中循環、跳轉、異常處理等都依賴程序計數器.編譯
有一個疑惑,看到有這麼一個問題,基本類型變量究竟存儲在哪裏?網上有兩種答案,第一種認爲都是存儲在虛擬機棧中.第二種認爲局部基本類型變量存儲在虛擬機棧中,可是對於全局基本類型變量存儲在堆中,引用類型變量存儲在虛擬機棧中.目前尚未確切答案,待測試過以後,再補充答案.變量