日本不卡不码高清免费观看,久久国产精品久久w女人spa,黄色aa久久,三上悠亚国产精品一区二区三区

您的位置:首頁技術(shù)文章
文章詳情頁

淺談Java內(nèi)存區(qū)域劃分和內(nèi)存分配策略

瀏覽:174日期:2022-09-01 15:13:40

如果不知道,類的靜態(tài)變量存儲在那? 方法的局部變量存儲在那? 趕快收藏

Java內(nèi)存區(qū)域主要可以分為共享內(nèi)存,堆、方法區(qū)和線程私有內(nèi)存,虛擬機棧、本地方法棧和程序計數(shù)器。如下圖所示,本文將詳細講述各個區(qū)域,同時也會講述創(chuàng)建對象過程,內(nèi)存分配策略, 和對象訪問定位原理。覺得寫得好的,可以點個收藏,絕對不虧。

淺談Java內(nèi)存區(qū)域劃分和內(nèi)存分配策略

Java內(nèi)存區(qū)域

程序計數(shù)器

程序計數(shù)器,可以看作程序當前線程所執(zhí)行的字節(jié)碼行號指示器。字節(jié)碼解釋器工作時就是通過改變計數(shù)器的值來選取下一條需要執(zhí)行的字節(jié)碼指令,分支、循環(huán)、跳轉(zhuǎn)、異常處理都需要依賴計數(shù)器完成。線程執(zhí)行Java方法時,記錄其正在執(zhí)行的虛擬機字節(jié)碼指令地址,線程執(zhí)行Native方法時,計數(shù)器記錄為空。程序計數(shù)器時唯一在Java虛擬機規(guī)范中沒有規(guī)定任何OutOfMemoryError情況區(qū)域。

理論可知,線程是通過輪流獲取CPU執(zhí)行時間以實現(xiàn)多線程的并發(fā)。為了暫停的線程下一次獲得CPU執(zhí)行時間,能正常運行,每一個線程內(nèi)部都需要維護一個程序計數(shù)器,用來記住暫停線程暫停的位置。

注意:光理論是不夠的,在此送大家一套2020最新Java架構(gòu)實戰(zhàn)教程+大廠面試寶典,點擊此處 進來獲取 一起交流進步哦!

Java虛擬機棧

Java虛擬機棧同程序計數(shù)器一樣,也是線程私有的,虛擬機棧描述的是Java方法執(zhí)行的內(nèi)存模型,每個方法在執(zhí)行的同時都會創(chuàng)建一個棧幀,用于存儲局部變量表,操作數(shù)棧、動態(tài)鏈接和方法出入口等信息。每一個方法從調(diào)用直至執(zhí)行完成的過程,就對應(yīng)著一個棧幀在虛擬機中入棧到出棧的過程。

本地方法棧

與虛擬機棧相似。虛擬機棧為虛擬機執(zhí)行Java方法服務(wù),而本地方法棧則為虛擬機使用到的Native方法服務(wù)。

Java堆

所有線程共享的一塊內(nèi)存區(qū)域。Java虛擬機所管理的內(nèi)存中最大的一塊,因為該內(nèi)存區(qū)域的唯一目的就是存放對象實例。幾乎所有的對象實例都在這里分配內(nèi)存,同時堆也是垃圾收集器管理的主要區(qū)域。因此很多時候被稱為'GC堆'

方法區(qū)

和堆一樣,是各個線程共享的內(nèi)存區(qū)域,用于存儲已被虛擬機加載的類信息、常量、靜態(tài)變量、和編譯器編譯后的代碼(也就是存儲字節(jié)碼文件.class)等數(shù)據(jù)。

方法區(qū)中有一個運行時常量池,編譯后期生成的各種字面量和符號引用,存放在字節(jié)碼文件中的常量池中。當類加載進入方法區(qū)時,就會把該常量池中的內(nèi)容放入方法區(qū)中的運行時常量池。此外也可以在程序運行期間,將新的常量放入運行時常量池,比如String.intern()方法,該方法先從運行時常量池中查找是否有該值,如果有,則返回該值的引用,否則將該值加入運行時常量池。

實例詳講

class Demo1_Car{ public static void main(String[] args) { Car c1 = new Car(); //調(diào)用屬性并賦值 c1.color = 'red'; c1.num = 8; //調(diào)用行為 c1.run(); Car c2 = new Car(); c2.color = 'black'; c2.num = 4; c2.run(); }}Class Car{ String color; int num; public void run() { System.out.println(color + '..' + num);}}

淺談Java內(nèi)存區(qū)域劃分和內(nèi)存分配策略

首先運行程序,Demo1_car.java就會變?yōu)镈emo1_car.class,Demo1_car.class加入方法區(qū),檢查是否字節(jié)碼文件常量池中是否有常量值,如果有,那么就加入運行時常量池。 遇到main方法,創(chuàng)建一個棧幀,入虛擬機棧,然后開始運行main方法中的程序。 Car c1 = new Car(), 第一次遇到Car這個類,所以將Car.java編譯為Car.class文件,然后加入方法區(qū).然后new Car(),在堆中創(chuàng)建一塊區(qū)域,用于存放創(chuàng)建出來的實例對象,地址為0X001.其中有兩個屬性值color和num。默認值是null和 0 然后通過c1這個引用變量去設(shè)置color和num的值,調(diào)用run方法,然后會創(chuàng)建一個棧幀,用來存儲run方法中的局部變量等。run 方法中就打印了一句話,結(jié)束之后,該棧幀出虛擬機棧。又只剩下main方法這個棧幀。 接著又創(chuàng)建了一個Car對象,所以又在堆中開辟了一塊內(nèi)存,之后就是跟之前的步驟一樣了。

創(chuàng)建對象過程

虛擬機在遇到一條new指令時,會首先檢查這個指令的參數(shù)是否可以在方法區(qū)中定位到一個類的符號引用,并且檢查這個符號引用所代表的類是否已經(jīng)被加載,解析和初始化過。如果沒有,則必須先執(zhí)行類加載過程.

類加載完之后,需要為對象分配內(nèi)存,有兩種分配內(nèi)存的方法

指針碰撞法(要求堆內(nèi)存規(guī)整)

Java堆中空閑內(nèi)存和已使用內(nèi)存分別存放在堆的兩邊,中間存放一個指針作為分界點的指示器,在為對象分配內(nèi)存時只需要將指針向空閑區(qū)域移動創(chuàng)建對象所需要的內(nèi)存大小即可。

空閑列表法

如果堆內(nèi)存中已使用內(nèi)存區(qū)域和空閑區(qū)域相互交錯,此時虛擬機需要維護一個列表,記錄哪些內(nèi)存塊是可用的,在分配時從列表中找到一塊足夠大的內(nèi)存區(qū)域劃分給對象實例并更新列表上的記錄。

多線程情況下,線程同時分配內(nèi)存可能會造成沖突,比如使用指針碰撞法,線程A正在分配內(nèi)存,還沒有改變指針指向,線程B,又同時使用原來的指針進行內(nèi)存分配。防止沖突有兩種方法

CAS操作:虛擬機采用CAS操作,加上失敗重試的方式保證內(nèi)存分配的原子性 本地線程分配緩沖(TLAB):預(yù)先為線程分配一部分堆內(nèi)存空間(線程私有,所以不存在同步問題)用于對象實例的內(nèi)存分配。只有當TLAB用完,需要分配新的TLAB時,才需要進行同步操作。

內(nèi)存分配完之后,虛擬機需要將分配到的內(nèi)存空間均初始化為零值(不包括對象頭)。在虛擬機中,執(zhí)行完new指令后會接著執(zhí)行方法,把對象按照程序員的意愿進行初始化,這樣一個真正可用的對象才算完全產(chǎn)生出來

對象在內(nèi)存中的布局

對象在內(nèi)存中的布局如下圖所示,分為對象頭、實例數(shù)據(jù)、對齊填充[外鏈圖片轉(zhuǎn)存失敗,源站可能有防盜鏈機制,建議將圖片保存下來直接上傳

淺談Java內(nèi)存區(qū)域劃分和內(nèi)存分配策略

對象頭(可以參考Java鎖升級)

mark Word, 用于存儲對象自身的運行時數(shù)據(jù),如哈希碼、GC分代年齡以及鎖狀態(tài)標志等。類型指針,即對象指向它的類元數(shù)據(jù)的指針,虛擬機通過這個指針來確定這個對象是哪個類的實例。

實例數(shù)據(jù)

對象真正存儲的有效信息,也是程序代碼中所定義的各種類型的字段內(nèi)容。

對齊填充

并非必然存在,僅僅起著占位符的作用。

對象的訪問定位

Java程序需要通過棧上的reference數(shù)據(jù)來操作堆上的具體對象。共有兩種策略進行對象的訪問定位

句柄訪問

Java堆中劃分出一塊內(nèi)存來作為句柄池,reference中存儲的是對象的句柄地址,而句柄中包含了對象實例數(shù)據(jù)與類型數(shù)據(jù)各自的具體地址信息,需要兩次尋址。

淺談Java內(nèi)存區(qū)域劃分和內(nèi)存分配策略

直接指針訪問

Java堆中對象的布局中需要考慮如何放置訪問類型數(shù)據(jù)的相關(guān)信息,而reference中存儲的直接就是對象地址。

淺談Java內(nèi)存區(qū)域劃分和內(nèi)存分配策略

使用句柄訪問的最大好處就是reference中存儲的是穩(wěn)定的句柄地址,在對象被移動(垃圾收集時移動對象是非常普遍的行為)時只會改變句柄中實例數(shù)據(jù)指針,而reference本身不需要修改。

問題

只需要記住一件事,就是Java對象的內(nèi)存分配均是在堆中進行的。所以對象都存儲在堆中。

但是有人可能會懷疑方法的臨時變量不是存儲在虛擬機棧中嗎?這里我要解釋一下,虛擬機棧維護了一個局部變量表,表中存儲的是對象的引用,而真正存儲對象的地方在堆,如果局部變量都在堆里分配,那么虛擬機棧早爆滿了

同樣類的靜態(tài)變量,有人又會懷疑在方法區(qū)中存儲。其實不是的,方法區(qū)只存儲引用,具體對象是存儲在堆中的,具體實現(xiàn)可以發(fā)現(xiàn),類靜態(tài)對象是與class對象一起分配的內(nèi)存。

參考

深入理解java虛擬機

到此這篇關(guān)于淺談Java內(nèi)存區(qū)域劃分和內(nèi)存分配策略的文章就介紹到這了,更多相關(guān)Java內(nèi)存區(qū)域劃分和內(nèi)存分配內(nèi)容請搜索好吧啦網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持好吧啦網(wǎng)!

標簽: Java
相關(guān)文章:
日本不卡不码高清免费观看,久久国产精品久久w女人spa,黄色aa久久,三上悠亚国产精品一区二区三区
高清久久一区| 成人片免费看| 亚洲精品在线观看91| 亚洲高清激情| 久久美女精品| 蜜桃av在线播放| 国产精品久久久久久久久妇女| 欧美日韩伊人| 国产精品手机在线播放| 麻豆久久久久久| 亚洲永久av| 欧美日韩免费观看一区=区三区| 99riav1国产精品视频| 91久久视频| 亚洲激情二区| 日本不卡一区二区三区| 天堂va欧美ⅴa亚洲va一国产| 婷婷视频一区二区三区| 国产精品亲子伦av一区二区三区 | 欧美+亚洲+精品+三区| 国产一区视频在线观看免费| 国产一区91| 日本不卡一二三区黄网| 国产高清日韩| 欧美成人a交片免费看| 欧美精品九九| 水野朝阳av一区二区三区| 午夜精品福利影院| 国产中文欧美日韩在线| 欧美/亚洲一区| 最新国产精品| 久久亚洲精品中文字幕| 99热国内精品| 中文字幕视频精品一区二区三区| 欧美在线观看天堂一区二区三区| 国产aⅴ精品一区二区四区| 亚洲电影在线| 欧美伊人久久| 在线手机中文字幕| 精品一区毛片| 欧美一区91| 亚洲黄色中文字幕| 亚洲一区二区三区中文字幕在线观看| 国产精品欧美大片| 免费欧美一区| 国产极品模特精品一二| 欧美午夜精品一区二区三区电影| 日本不卡不码高清免费观看 | 亚洲精品字幕| 精品一区二区三区视频在线播放 | 青青青国产精品| 91欧美国产| 蜜桃av一区| 高清一区二区| 免费国产自线拍一欧美视频| 国产激情欧美| 激情六月综合| 国产伦精品一区二区三区千人斩| 中文在线免费视频| 免费不卡在线观看| 免费一级欧美在线观看视频| 亚洲大全视频| 最新国产精品视频| 精品国产欧美日韩| 首页亚洲欧美制服丝腿| 精品视频网站| 亚洲欧美日韩在线观看a三区| 国产丝袜一区| 亚洲少妇一区| 精品国产乱码久久久久久樱花| 欧美日韩视频| 久久精品一区二区三区中文字幕| 国产一区清纯| 麻豆精品在线播放| 亚洲一区二区三区中文字幕在线观看 | 亚洲免费观看高清完整版在线观| 国产精品成人自拍| 99pao成人国产永久免费视频| 久久成人福利| 国产精品美女久久久| 精品中文在线| 亚洲日韩视频| 久久久久亚洲| 欧美精品导航| 亚洲人妖在线| 欧美福利一区| 国产一区二区三区天码| 午夜久久av| 美女网站一区| 精品国产精品久久一区免费式| 一区三区视频| 国产精品久久久久久久久妇女| 日韩福利在线观看| 国产亚洲永久域名| 久久九九国产| 成人午夜毛片| 欧美精品国产一区| 亚洲一区二区小说| 日韩视频中文| 91精品国产91久久久久久黑人| 欧美国产另类| 日韩中出av| 久久av在线| 免费视频一区三区| 日韩黄色大片| 国产精品v一区二区三区| 久久性天堂网| 亚洲福利久久| 日韩一区电影| 成人午夜网址| 精品国产欧美| 国产精品久久久久久妇女| 男女男精品视频网| av不卡在线| 欧美aa国产视频| 亚洲成av人片一区二区密柚| 国产一区二区色噜噜| 88久久精品| 亚洲欧美一级| 欧美日韩国产在线一区| 久久精品国产大片免费观看| 精品黄色一级片| 国产精品日本一区二区三区在线 | 欧美日韩免费观看一区=区三区| 欧美久久天堂| 日韩电影免费网站| а√在线中文在线新版| 成人综合一区| 精品久久久网| 成午夜精品一区二区三区软件| 精品国产一区二| 国产精品美女在线观看直播| 欧美日韩va| 国产精品视频一区二区三区四蜜臂 | 国产欧美88| 久久精品 人人爱| 国产精品一区二区三区四区在线观看 | 欧美好骚综合网| 精品久久久久中文字幕小说| 欧美aⅴ一区二区三区视频| 青青草国产精品亚洲专区无| 青青草91视频| 国产欧美日韩精品一区二区免费 | 亚洲青青久久| 日韩福利视频导航| 国产剧情在线观看一区| 国产精品亚洲综合久久| 国产精品中文字幕亚洲欧美| 久久只有精品| 国产精品大片免费观看| 久久久亚洲欧洲日产| 成人在线观看免费视频| 中文av在线全新| 国内亚洲精品| 蘑菇福利视频一区播放| 亚洲tv在线| 国产精品chinese| 中文av在线全新| 蜜桃tv一区二区三区| 亚洲欧美日韩国产综合精品二区| 中文字幕视频精品一区二区三区 | 午夜在线播放视频欧美| 蜜桃视频在线观看一区| 亚洲婷婷丁香| 国产精品一区二区三区av麻| 国产suv精品一区| 亚洲国内欧美| 蜜桃久久久久久久| 国产精品传媒麻豆hd| 伊人网在线播放| 欧美日韩免费观看一区=区三区| 免费看精品久久片| 欧美日韩在线精品一区二区三区激情综合| 国产精品传媒麻豆hd| 日韩在线欧美| 日韩中文字幕av电影| 欧美一级久久| av免费不卡国产观看| 欧美日韩一二三四| 中文字幕一区二区三区在线视频| 国产精品第一国产精品| 91精品一区二区三区综合| 一区二区日韩免费看| 久久三级毛片| 9国产精品视频| 免费在线欧美黄色| 免费视频一区三区| 国产美女撒尿一区二区| 久久精品国产99久久| 日本免费一区二区视频| 伊人久久在线| 免费的成人av| 国产精品福利在线观看播放| 蜜桃国内精品久久久久软件9| 日韩高清国产一区在线| 亚洲美女久久精品| 日本一不卡视频| av一区在线| 日本少妇一区二区| 激情综合激情|