亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 編程 > Java > 正文

深入探討Java內存區域

2019-11-26 15:02:25
字體:
來源:轉載
供稿:網友

一、概述
Java虛擬機在執行Java程序的過程中會把它所管理的內存劃分為若干不同的數據區域,這些區域都有各自的用途以及創建和銷毀的時間。Java虛擬機所管理的內存將會包括以下幾個運行時數據區域,如下圖所示:

下面就每一個區域進行闡述。

二、運行時數據區域
程序計數器

程序計數器,可以看做是當前線程所執行的字節碼的行號指示器。在虛擬機的概念模型里,字節碼解釋器工作就是通過改變程序計數器的值來選擇下一條需要執行的字節碼指令,分支、循環、跳轉、異常處理、線程恢復等基礎功能都要依賴這個計數器來完成。

多線程中,為了讓線程切換后能恢復到正確的執行位置,每條線程都需要有一個獨立的程序計數器,各條線程之間互不影響、獨立存儲,因此這塊內存是 線程私有 的。

當線程正在執行的是一個Java方法,這個計數器記錄的是在正在執行的虛擬機字節碼指令的地址;當執行的是Native方法,這個計數器值為空。

此內存區域是唯一一個沒有規定任何OutOfMemoryError情況的區域 。

Java虛擬機棧
Java虛擬機棧也是線程私有的 ,它的生命周期與線程相同。虛擬機棧描述的是Java方法執行的內存模型:每個方法在執行的同時都會創建一個棧幀用于存儲局部變量表、操作數棧、動態鏈表、方法出口信息等。每一個方法從調用直至執行完成的過程,就對應著一個棧幀在虛擬機棧中入棧到出棧的過程。

局部變量表中存放了編譯器可知的各種基本數據類型(boolean、byte、char、short、int、float、long、double)、對象引用和returnAddress類型(指向了一條字節碼指令的地址)。

如果擴展時無法申請到足夠的內存,就會拋出OutOfMemoryError異常。

本地方法棧
本地方法棧與虛擬機的作用相似,不同之處在于虛擬機棧為虛擬機執行的Java方法服務,而本地方法棧則為虛擬機使用到的Native方法服務。有的虛擬機直接把本地方法棧和虛擬機棧合二為一。

會拋出stackOverflowError和OutOfMemoryError異常。

Java堆

Java堆是所有線程共享的一塊內存區域,在虛擬機啟動時創建,此內存區域的唯一目的就是存放對象實例 。

Java堆是垃圾收集器管理的主要區域。由于現在收集器基本采用分代回收算法,所以Java堆還可細分為:新生代和老年代。從內存分配的角度來看,線程共享的Java堆中可能劃分出多個線程私有的分配緩沖區(TLAB)。

Java堆可以處于物理上不連續的內存空間,只要邏輯上連續的即可。在實現上,既可以實現固定大小的,也可以是擴展的。

如果堆中沒有內存完成實例分配,并且堆也無法完成擴展時,將會拋出OutOfMemoryError異常。

方法區

方法區是各個線程共享的內存區域,它用于存儲已被虛擬機加載的類信息、常量、靜態變量、即時編譯器編譯后的代碼等數據 。

相對而言,垃圾收集行為在這個區域比較少出現,但并非數據進了方法區就永久的存在了,這個區域的內存回收目標主要是針對常量池的回收和對類型的卸載,

當方法區無法滿足內存分配需要時,將拋出OutOfMemoryError異常。

運行時常量池:

是方法區的一部分,它用于存放編譯期生成的各種字面量和符號引用。

直接內存

直接內存不是虛擬機運行時數據區的一部分,在NIO類中引入一種基于通道與緩沖區的IO方式,它可以使用Native函數庫直接分配堆外內存,然后通過一個存儲在Java堆中的DirectByteBuffer對象作為這塊內存的引用進行操作。

直接內存的分配不會受到Java堆大小的限制,但是會受到本機內存大小的限制,所有也可能會拋OutOfMemoryError異常。

三、對象的創建、布局和訪問過程
對象的創建

創建一個對象通常是需要new關鍵字,當虛擬機遇到一條new指令時,首先檢查這個指令的參數是否在常量池中定位到一個類的符號引用,并且檢查這個符號引用代表的類是否已被加載、解析和初始化過。如果那么執行相應的類加載過程。

類加載檢查通過后,虛擬機將為新生對象分配內存。為對象分配空間的任務等同于把一塊確定大小的內存從Java堆中劃分出來。分配的方式有兩種: 一種叫 指針碰撞 ,假設Java堆中內存是絕對規整的,用過的和空閑的內存各在一邊,中間放著一個指針作為分界點的指示器,分配內存就是把那個指針向空閑空間的那邊挪動一段與對象大小相等的距離。 另一種叫 空閑列表 :如果Java堆中的內存不是規整的,虛擬機就需要維護一個列表,記錄哪個內存塊是可用的,在分配的時候從列表中找到一塊足夠大的空間劃分給對象實例,并更新列表上的記錄。 采用哪種分配方式是由Java堆是否規整決定的,而Java堆是否規整是由所采用的垃圾收集器是否帶有壓縮整理功能決定的。 另 外一個需要考慮的問題就是對象創建時的線程安全問題,有兩種解決方案:一是對分配內存空間的動作進行同步處理;另一種是吧內存分配的動作按照線程劃分在不 同的空間之中進行,即每個線程在Java堆中預先分配一小塊內存(TLAB),哪個線程要分配內存就在哪個線程的TLAB上分配,只有TLAB用完并分配 新的TLAB時才需要同步鎖定。

內存分配完成后,虛擬機需要將分配到的內存空間初始化為零值。這一步操作保證了對象的實例字段在Java代碼中可以不賦初始值就可以直接使用。

接下來虛擬機要對對象進行必要的設置,例如這個對象是哪個類的實例、如何才能找到類的元數據信息等,這些信息存放在對象的對象頭中。

上面的工作都完成以后,從虛擬機的角度來看一個新的對象已經產生了。但是從Java程序的角度,還需要執行init方法,把對象按照程序員的意愿進行初始化,這樣一個真正可用的對象才算完全產生出來。

對象的內存布局
在HotSpot虛擬機中,對象在內存中存儲的布局可分為三個部分: 對象頭、實例數據和對齊填充。

對象頭包括兩個部分:第一部分用于存儲對象自身的運行時數據,如哈希碼、GC分代年齡、線程所持有的鎖等。官方稱之為“Mark Word”。第二個部分為是類型指針,即對象指向它的類元數據的指針,虛擬機通過這個指針來確定這個對象是哪個類的實例。

實例數據是對象真正存儲的有效信息,也是程序代碼中所定義的各種類型的字段內容。

對齊填充并不是必然存在的,僅僅起著占位符的作用。、Hotpot VM要求對象起始地址必須是8字節的整數倍,對象頭部分正好是8字節的倍數,所以當實例數據部分沒有對齊時,需要通過對齊填充來對齊。

對象的訪問定位
Java程序通過棧上的reference數據來操作堆上的具體對象。主要的訪問方式有使用句柄和直接指針兩種:

句柄:Java堆將會劃出一塊內存來作為句柄池,引用中存儲的就是對象的句柄地址,而句柄中包含了對象實例數據與類型數據各自的具體地址信息 。如圖所示:

直接指針:Java堆對象的布局要考慮如何放置訪問類型數據的相關信息,引用中存儲的就是對象地址 。如圖所示:

兩個方式各有優點,使用句柄最大的好處是引用中存儲的是穩定的句柄地址,對象被移動時只會改變句柄中實例的地址,引用不需要修改、使用直接指針訪問的好處是速度更快,它節省了一次指針定位的時間開銷。

以上就是本文的全部內容,希望對大家的學習有所幫助。

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
欧美日韩国产综合视频在线观看中文| 福利微拍一区二区| 色综合伊人色综合网| www.xxxx欧美| 北条麻妃一区二区三区中文字幕| 国产男人精品视频| 亚洲欧洲在线播放| 97久久久久久| 国产精品久久久久免费a∨大胸| 日韩精品中文字幕久久臀| 日韩美女中文字幕| 亚洲欧美中文日韩在线| 亚洲激情视频在线观看| 欧美精品久久久久| 国产激情综合五月久久| 亚洲国产精品悠悠久久琪琪| 日韩一区二区精品视频| 欧美色视频日本版| 国产欧美日韩丝袜精品一区| 国产精品成人va在线观看| 成人精品视频99在线观看免费| 国产精品视频yy9099| 久久免费国产精品1| 久久最新资源网| 亚洲精品久久久一区二区三区| 国产99久久久欧美黑人| 亚洲人午夜精品| 亚洲日本中文字幕免费在线不卡| 亚洲自拍小视频免费观看| 亚洲欧美综合另类中字| 亚洲综合大片69999| 国产精品高清网站| 国产在线98福利播放视频| 亚洲影院色在线观看免费| 欧美极品少妇xxxxⅹ免费视频| 蜜臀久久99精品久久久无需会员| 91亚洲精品久久久| 在线视频中文亚洲| 色多多国产成人永久免费网站| 欧美又大粗又爽又黄大片视频| 亚洲欧美999| 日本不卡视频在线播放| 亚洲欧美国产制服动漫| 亚洲第一av网站| 欧美最猛性xxxxx(亚洲精品)| 色偷偷综合社区| 久久亚洲精品一区| 欧美激情第1页| 97在线观看免费高清| 欧美大尺度电影在线观看| 久久99精品久久久久久青青91| 91精品国产91久久久久久吃药| 午夜精品福利在线观看| 91麻豆桃色免费看| 亚洲香蕉成视频在线观看| 久久久女人电视剧免费播放下载| 欧美视频专区一二在线观看| 亚洲第一网站免费视频| 亚洲第一中文字幕| 亚洲精品在线91| 亚洲天堂网站在线观看视频| 久久福利视频网| 日韩中文在线视频| 久久激情五月丁香伊人| 国产精品久久久久久久久久99| 亚洲男人天堂2024| 亚洲japanese制服美女| 亚洲人成在线观看网站高清| 成人性生交大片免费看视频直播| 黑人巨大精品欧美一区免费视频| 亚洲成人av在线| 久久91精品国产91久久跳| 亚洲另类欧美自拍| 最近2019免费中文字幕视频三| 国产专区欧美专区| 亚洲精品美女在线| 亚洲影院在线看| 国产精品日韩专区| 欧美电影免费观看| 成人在线视频网| 亚洲精品国产美女| 国产成人精品久久二区二区91| 欧美日本高清一区| 日韩激情第一页| 久久久久久久久久av| 国语自产精品视频在免费| 亚洲aⅴ男人的天堂在线观看| 成人免费在线视频网址| 国产精品女人网站| 国产中文日韩欧美| 一区二区三区视频免费在线观看| 亚洲综合中文字幕68页| 国产精品678| 精品国产欧美成人夜夜嗨| 91精品视频在线播放| 欧美日韩一区二区免费视频| 高清欧美性猛交| 成人a级免费视频| 日本午夜人人精品| 欧美怡红院视频一区二区三区| 亚洲免费精彩视频| 久久久久www| 97视频在线观看免费高清完整版在线观看| 精品国产一区二区三区久久狼黑人| 77777少妇光屁股久久一区| 久久男人av资源网站| 国产一区二区三区欧美| 亚洲视频第一页| 91久热免费在线视频| 国产精品美腿一区在线看| 中文字幕亚洲情99在线| 色偷偷噜噜噜亚洲男人的天堂| 久久精品99无色码中文字幕| 欧美美女操人视频| 成人在线中文字幕| 久久影院在线观看| 久久精品久久精品亚洲人| 亚洲国产欧美一区二区丝袜黑人| 欧美一区二粉嫩精品国产一线天| 91亚洲永久免费精品| 亚洲欧美日韩中文在线制服| 欧美成人精品在线视频| 日韩精品视频中文在线观看| 亚洲欧美日韩图片| 欧美乱大交xxxxx另类电影| 欧美精品成人在线| 国产精品日韩在线| 国产精品视频内| 欧美一性一乱一交一视频| 亚洲国产高潮在线观看| 亚洲老司机av| 97久久久久久| 亚洲xxxxx电影| 亚洲人成在线电影| 一区二区欧美久久| 日韩美女视频在线观看| 日本欧美中文字幕| 欧美性xxxxx极品娇小| 久久精品免费电影| 欧美亚洲视频在线看网址| 狠狠操狠狠色综合网| 日韩av免费看| 亚洲裸体xxxx| 97视频人免费观看| 一区二区三区四区在线观看视频| 亚洲国产精彩中文乱码av在线播放| 欧美午夜女人视频在线| 国产成人久久精品| 精品久久在线播放| 91视频九色网站| 欧美激情小视频| 在线观看日韩专区| 韩国美女主播一区| 欧美精品18videos性欧| 国内精品400部情侣激情| 欧美精品在线视频观看| 在线观看欧美日韩国产| xxxxx91麻豆| 亚洲人成77777在线观看网| 国产亚洲精品久久久久动| 亚洲精品一区久久久久久| 日韩国产精品视频| 国产va免费精品高清在线| 国产精品久久久久久久久久久久|