Java 内存分配
JVM內存區域模型:
?
線程私有的
程序計數器:程序計數器是一塊較小的區域,可以看做是當前線程所執行的字節碼的行號指示器,是Java虛擬機中唯一沒有定義OutOfMemory異常的區域。
虛擬機棧:虛擬機棧描述的是Java方法執行的內存模型:每個方法被執行的時候都會創建一個棧幀用于存儲局部變量表,操作棧,動態鏈接,方法出口等信息。每一個方法被調用的過程就對應一個棧幀在虛擬機棧中從入棧到出棧的過程。
? ? ? ? ? ? ? Java虛擬機棧可能出現兩種類型的異常:
? ? ? ? ? ? ? 1. 線程請求的棧深度大于虛擬機允許的棧深度,將拋出StackOverflowError。
? ? ? ? ? ? ? 2.虛擬機棧空間可以動態擴展,當動態擴展是無法申請到足夠的空間時,拋出OutOfMemory異常。
本地方法棧:本地方法棧和虛擬機棧基本類似,只不過Java虛擬機棧執行的是Java代碼(字節碼),本地方法棧中執行的是本地方法的服務。本地方法棧中也會拋出StackOverflowError和OutOfMemory異常。
線程共享部分:
堆:堆是Java虛擬機所管理的內存中最大的一塊。堆是所有線程共享的一塊區域,在虛擬機啟動時創建。堆的唯一目的是存放對象實例。
? ? ? Java堆可以是物理上不連續的空間,只要邏輯上連續即可,主流的虛擬機都是按照可擴展的方式來實現的。如果當前對中沒有內存完成對象實例的創建,并且不能在進行內存擴展,則會拋出OutOfMemory異常。
方法區:方法區也是線程共享的區域,用于存儲已經被虛擬機加載的類信息,常量,靜態變量和即時編譯器(JIT)編譯后的代碼等數據。
?
?對象訪問
? ? ? ?對象訪問在Java語言中無處不在,即使是最簡單的訪問,也會涉及到Java棧,java堆,方法區這三個最重要的內存區域之間的關聯關系。
? ? ? 主流的訪問方式有兩種:句柄訪問方式和直接指針。
? ? ?1. 如果使用句柄訪問方式,Java堆中將會劃分出一塊內存來作為句柄池,reference中存儲的就是對象的地址,而句柄中包含了對象實例數據和類型數據各自的具體地址信息。
? ? ?
? ?2. 如果通過直接指針方式訪問,Java堆對象的布局中就必須考慮如何放置訪問類型數據的相關信息,reference中直接存儲的就是對象的地址。
? ?
兩種方式各有優勢,句柄訪問方式最大的好處是reference中存放的是穩定的句柄地址,在對象被移動時,只會改變句柄中的實例數據指針,而reference本身不需要被修改。
而指針訪問的最大優勢是速度快,它節省了一次指針定位的開銷,由于對象訪問在Java中非常頻繁,一次這類開銷積少成多后也是一項非常可觀的成本。
?
http://blog.csdn.net/OyangYujun/article/details/41173747
http://blog.csdn.net/yangyuankp/article/details/7651251
http://www.cnblogs.com/paddix/p/5309550.html
轉載于:https://www.cnblogs.com/hongdada/p/6928556.html
總結
- 上一篇: E-UTRA channel bandw
- 下一篇: JS中Node节点总结