java虚拟机 第二章Java内存区域与内存溢出异常
1、運行時數(shù)據(jù)區(qū)域
1.1、程序計數(shù)器
線程私有,當前線程所執(zhí)行的字節(jié)碼行號指示器,
Java虛擬機的多線程是通過線程輪流切換處理器執(zhí)行時間的方式來分配
1.2、Java虛擬機棧
線程私有,,虛擬機的局部變量表每個方法在執(zhí)行的時候都會創(chuàng)建棧幀用于存儲局部變量,操作數(shù)棧,動態(tài)鏈接方法出口等信息,每個方法從開始到結束
對應著一個棧幀從入棧到出棧的過程,
1.3、本地方法棧
線程私有,本地方法棧是為虛擬機執(zhí)行native方法服務,有的虛擬機獎本地方法棧與虛擬機棧合二為一。
1.4、Java堆
GC堆,垃圾收集器管理的主要區(qū)域,用于存放對象實例,幾乎所有的Java對象實例都在這里分配空間,
1.5、方法區(qū)
用于存放虛擬機加載的類信息,常量,靜態(tài)變量,方法區(qū)中包含的都是在整個程序中永遠唯一的元素,如class,static變量
1.6、運行時常量池
JVM在執(zhí)行某個類的時候,必須經(jīng)過加載、連接、初始化,而連接又包括驗證、準備、解析三個階段。
而當類加載到內(nèi)存中后,jvm就會將class常量池中的內(nèi)容存放到運行時常量池中,由此可知,運行時常量池也是每個類都有一個。
在解析階段,會把符號引用替換為直接引用,解析的過程會去查詢字符串常量池,也就是我們上面所說的StringTable,
以保證運行時常量池所引用的字符串與字符串常量池中是一致的。
1.7、直接內(nèi)存
Java使用naive函數(shù)庫直接分配堆外內(nèi)存,避免了在java堆和native堆中來回復制數(shù)據(jù)
2、hotspot虛擬機
2.1、對象的創(chuàng)建
如果java虛擬機的空閑內(nèi)存是連續(xù)的,直接向后挪出一段與對象大小相等的距離,稱為 指針碰撞
如果不連續(xù),則從剩余內(nèi)存中尋找出足夠大小的內(nèi)存存放,稱 為 空閑列表方式
如何避免線程安全
為每個線程分配空間
cas配上失敗重試
2.2對象的內(nèi)存布局
對象頭:運行時的自身數(shù)據(jù)(哈希碼,gc分代年齡,鎖狀態(tài))、類型指針
實例數(shù)據(jù):對象真正存儲的數(shù)據(jù)
對齊填充:每個對象的起始地址必須為8字節(jié)的整數(shù)倍
2.3 對象的訪問定位
句柄訪問:reference指向句柄池接著再指向具體對象,避免了對象的修改而需要修改reference的修改,增加了一次尋址
直接指針定位:直接指向具體對象,
轉(zhuǎn)載于:https://www.cnblogs.com/karryzhang/p/9607522.html
總結
以上是生活随笔為你收集整理的java虚拟机 第二章Java内存区域与内存溢出异常的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Eclipse配置关联Tomcat并运行
- 下一篇: RxJava尝试取代Handler初探