這篇文章主要講解了“Java中內(nèi)存區(qū)域與對象的概念和作用”,文中的講解內(nèi)容簡單清晰,易于學(xué)習(xí)與理解,下面請大家跟著小編的思路慢慢深入,一起來研究和學(xué)習(xí)“Java中內(nèi)存區(qū)域與對象的概念和作用”吧!
創(chuàng)新互聯(lián)公司是一家集網(wǎng)站建設(shè),雁峰企業(yè)網(wǎng)站建設(shè),雁峰品牌網(wǎng)站建設(shè),網(wǎng)站定制,雁峰網(wǎng)站建設(shè)報價,網(wǎng)絡(luò)營銷,網(wǎng)絡(luò)優(yōu)化,雁峰網(wǎng)站推廣為一體的創(chuàng)新建站企業(yè),幫助傳統(tǒng)企業(yè)提升企業(yè)形象加強(qiáng)企業(yè)競爭力。可充分滿足這一群體相比中小企業(yè)更為豐富、高端、多元的互聯(lián)網(wǎng)需求。同時我們時刻保持專業(yè)、時尚、前沿,時刻以成就客戶成長自我,堅持不斷學(xué)習(xí)、思考、沉淀、凈化自己,讓我們?yōu)楦嗟钠髽I(yè)打造出實(shí)用型網(wǎng)站。
1、Java虛擬機(jī)包含以下幾個運(yùn)行時數(shù)據(jù)區(qū)域:程序計數(shù)器、Java虛擬機(jī)棧、本地方法棧、Java堆、方法區(qū)。
2、程序計數(shù)器
1)在虛擬機(jī)的概念模型里,字節(jié)碼解釋器工作時就是通過改變這個計數(shù)器的值來選取下一條需要執(zhí)行的字節(jié)碼指令,分支、循環(huán)、跳轉(zhuǎn)、異常處理、線程恢復(fù)等都需要依賴計數(shù)器來完成;
2)為了線程切換后能恢復(fù)到正確的執(zhí)行位置,每條線程都需要有一個獨(dú)立的程序計數(shù)器,各條線程之間計數(shù)器互不影響,獨(dú)立存儲,因此是線程獨(dú)立的;
3)如果正在執(zhí)行一個Java方法,這個計數(shù)器記錄的是正在執(zhí)行的虛擬機(jī)字節(jié)碼指令的地址;如果正在執(zhí)行的是Native方法,,這個計數(shù)器的值則為空;
4)此內(nèi)存區(qū)域是唯一一個在Java虛擬機(jī)規(guī)范中沒有規(guī)定任何OutOfMemoryError情況的區(qū)域。
3、Java虛擬機(jī)棧
1)線程私有,生命周期與線程相同;
2)描述的是Java方法執(zhí)行的內(nèi)存模型:每個方法執(zhí)行時都會創(chuàng)建一個棧幀用于存儲局部變量表、操作數(shù)棧、動態(tài)鏈接、方法出口等信息,每個方法從調(diào)用直至執(zhí)行完成的過程,就對應(yīng)著一個棧幀在虛擬機(jī)棧中入棧到出棧的過程;
3)兩種異常:StackOverflowError和OutOfMemoryError。
4、本地方法棧
1)與虛擬機(jī)棧作用相似,區(qū)別是虛擬機(jī)棧為虛擬機(jī)執(zhí)行Java方法服務(wù),而本地方法棧為虛擬機(jī)使用到的Native方法服務(wù);
2)兩種異常:StackOverflowError和OutOfMemoryError。
5、Java堆
1)所有線程共享,存放對象實(shí)例和數(shù)組;
2)Java堆是垃圾收集器管理的主要區(qū)域;
3)Java堆可以處于物理上不連續(xù)的內(nèi)存空間中,只要邏輯上連續(xù)即可;
4)如果沒有內(nèi)存完成實(shí)例分配,并且堆也無法擴(kuò)展時,將拋出OutOfMemoryError異常。
6、方法區(qū)
1)所有線程共享,存放被虛擬機(jī)加載的類信息、常量、靜態(tài)變量、即時編譯器編譯后的代碼等數(shù)據(jù);
2)JDK1.8仍然保留方法區(qū)的概念,只不過實(shí)現(xiàn)方式不同,取消永久代,方法存放于元空間(Metaspace),元空間仍然與堆不相連,但與堆共享物理內(nèi)存,邏輯上可認(rèn)為在堆中;
3)無法滿足內(nèi)存分配需求時,將拋出OutOfMemoryError異常。
7、使用new創(chuàng)建對象的過程
1)類加載檢查。首先檢查這個指令的參數(shù)是否能在常量池中定位到一個符號引用,并檢查這個符號引用代表的類是否已經(jīng)被加載、解析和初始化,如果沒有,則必須執(zhí)行類加載過程;
2)分配內(nèi)存。兩種分配方式:指針碰撞和空閑列表。指針碰撞要求Java堆內(nèi)存是絕對規(guī)整的,空閑列表允許Java堆不規(guī)整。采用那種方法取決于采用的垃圾收集器。
3)考慮并發(fā)問題。兩種方案:一種是CAS+失敗重試保證原子性,另一種是本地線程分配緩沖(TLAB),事先給每個線程分配一小塊內(nèi)存,分配完了才需要同步鎖定。
4)初始化零值。保證對象的實(shí)例字段在Java代碼中不賦初值就可以直接使用。
5)設(shè)置對象信息。例如對象是哪個類的實(shí)例、如何才能找到類的元數(shù)據(jù)信息、對象的哈希碼、對象的GC分代年齡等信息。這些信息存放在對象頭中。
6)執(zhí)行<init>方法。
8、對象的內(nèi)存布局
1)3塊區(qū)域:對象頭、實(shí)例數(shù)據(jù)、對齊填充;
2)對象頭:包含兩部分信息,一部分用于存儲自身的運(yùn)行時數(shù)據(jù),如哈希碼、GC分代年齡、鎖狀態(tài)標(biāo)志、線程持有的鎖、偏向鎖線程ID、偏向時間戳等,另一部分是類型指針,指向它的類元數(shù)據(jù)的指針。
3)實(shí)例數(shù)據(jù):是一個對象真正存儲的有效信息。
4)對齊填充:并不是必然存在的,由于HotpotVM的自動內(nèi)存管理系統(tǒng)要求對象起始地址必須是8字節(jié)的整數(shù)倍,因此沒有對齊的部分需要通過填充來補(bǔ)全。
9、對象的訪問定位:主流的訪問方式有使用句柄和直接指針兩種,HotSpt采用的第二種方式訪問對象。
感謝各位的閱讀,以上就是“Java中內(nèi)存區(qū)域與對象的概念和作用”的內(nèi)容了,經(jīng)過本文的學(xué)習(xí)后,相信大家對Java中內(nèi)存區(qū)域與對象的概念和作用這一問題有了更深刻的體會,具體使用情況還需要大家實(shí)踐驗證。這里是創(chuàng)新互聯(lián),小編將為大家推送更多相關(guān)知識點(diǎn)的文章,歡迎關(guān)注!
網(wǎng)站名稱:Java中內(nèi)存區(qū)域與對象的概念和作用
網(wǎng)站地址:http://aaarwkj.com/article0/gjcsio.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供搜索引擎優(yōu)化、定制網(wǎng)站、網(wǎng)站導(dǎo)航、Google、靜態(tài)網(wǎng)站、網(wǎng)站建設(shè)
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會在第一時間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時需注明來源: 創(chuàng)新互聯(lián)