JVM運行時數據區域;HostSpot虛擬機對象建立(java堆給對象分配內存的方式,解決對象內存分配的線程安全方案,對象內存佈局,對象的訪問定位,異常實例);java
Java虛擬機在執行Java程序的過程當中會把它管理的內存劃分爲若干個不一樣的數據區域。這些區域都有各自的用途,根據Java虛擬機規範的規定,虛擬機所管理內存會被分爲以下圖所示的幾個區域:程序員
虛擬機遇到一條new指令時,首先將去檢查這個指令的參數是否能在常量池中定位到一個類的符號引用,而且檢查這個符號引用表明的類是否已經被加載、解析和初始化過。若是沒有,那必須先執行相應的類加載過程。在類加載檢查經過後,接下來虛擬機將爲新生對象分配內存。對象所需內存的大小在類加載完成後,即可以徹底肯定,爲對象分配空間的任務等同於把一塊肯定大小的內存從java堆中劃分出來。內存分配完成後,虛擬機將要分配到的內存空間都初始化爲零值(不包括對象頭),若是使用TLAb,這一工做過程也能夠提早至TLAB分配時進行。這一步操做,保證了對象的實例字段在java代碼中能夠不賦是初始值就直接使用,程序能訪問到這些字段的數據類型所對應的零值。最後在執行new指令後,會接着執行init方法,把對象按照程序員的意願進行初始化,這樣一個真正可用的對象纔算徹底產生出來。安全
ps:虛擬機是否使用TLAb,能夠經過–XX:+/UseTLAB參數來設定網絡
說明:若是使用句柄訪問的話,那麼Java堆中將會劃分出一起內存做爲句柄池,reference中存儲的就是對象的句柄
地址,而句柄中包含了對象實例數據與類型數據各自的具體的地址信息。佈局
說明:若是使用直接指針訪問,那麼Java堆對象的佈局中就必須考慮如何放置訪問類型數據的具體信息,而reference中
存儲的直接就是對象地址。學習
使用句柄來訪問的最大好處就是reference中存儲的是穩定的句柄地址,在對象被移動(垃圾收集時移動對象是很是廣泛的行爲)時只會改變句柄中的實例數據指針,而reference自己不須要修改;使用直接指針訪問方式的最大好處就是速度更快,它節省了一次指針定位的時間開銷,因爲對象的訪問在Java中很是頻繁,所以這類開銷聚沙成塔後也是一項很是可觀的執行成本。spa
注:就HotSpot而言,它是使用的直接指針的方式進行對象訪問的。線程
java.lang.OutOfMemoryError指針
java.lang.StackOverflowError對象
聲明:本文是我的學習筆記,內容來自《深刻理解Java虛擬機·JVM高級特性與最佳實踐》周志明 與網絡文章