JVM學習——運行時數(shù)據(jù)區(qū)

一,JVM內(nèi)存結構

jvm03.png
  • JVM內(nèi)存主要分為:堆內(nèi)存、方法區(qū)和棧
  • 堆內(nèi)存存儲對象實例净嘀,由新生代老年代組成
  • 方法區(qū)存儲類信息报咳、常量、靜態(tài)變量等數(shù)據(jù)
  • 又分為java虛擬機棧本地方法棧挖藏,主要用于方法的執(zhí)行

二暑刃,各區(qū)域參數(shù)設置

jvm04.png
  • -Xms 堆的最小空間大小。
  • -Xmx 堆的最大空間大小膜眠。
  • -XX:NewSize 新生代最小空間大小岩臣。
  • -XX:MaxNewSize 新生代最大空間大小。
  • -XX:PermSize 永久代(方法區(qū))最小空間大小宵膨。
  • -XX:MaxPermSize 永久代(方法區(qū))最大空間大小架谎。
  • -Xss 每個線程的堆棧大小。
    老年代空間=堆空間-年輕代大空間
jvm05.png

三辟躏,Java堆(Heap)

  1. 存放對象實例狐树。
  2. 所有線程共享。
  3. 垃圾收集的主要區(qū)域鸿脓,采用分代收集算法抑钟,分為新生代老年代,新生代內(nèi)存又分為Eden空間野哭、From Survivor空間在塔、To Survivor空間,默認按8:1:1的比例分配。
  4. 物理不連續(xù)拨黔,邏輯上連續(xù)蛔溃,可擴展(通過-Xmx和-Xms控制)。
  5. 堆內(nèi)存不足以完成實例分配篱蝇,并且無法再擴展時贺待,拋出OutOfMemoryError

四零截,方法區(qū)(Method Area)

  1. 存儲已加載的類信息麸塞、常量、靜態(tài)變量涧衙、即時編譯器編譯后的代碼哪工,又稱為永久代(Permanent Generation)
  2. 所有線程共享弧哎。
  3. 方法區(qū)主要針對常量池的回收和對類型的卸載雁比,回收“成績”較差,其中類型的卸載條件相當苛刻撤嫩。
  4. 當方法區(qū)無法滿足內(nèi)存分配需求時偎捎,將拋出OutOfMemoryError

五,Java虛擬機棧(JVM Stacks)

  1. 線程私有的茴她,它的生命周期與線程相同
  2. 每個方法被調(diào)用直至執(zhí)行完成的過程蜕径,對應一個棧幀在虛擬機棧中從入棧到出棧的過程。
  3. 虛擬機棧是執(zhí)行Java方法的內(nèi)存模型:每個方法被執(zhí)行時會創(chuàng)建一個棧幀(Stack Frame)败京,用于存儲局部變量表、操作棧梦染、動態(tài)鏈接赡麦、方法出口等信息。
  4. 局部變量表存放了編譯期可知的基本類型(boolean帕识、byte泛粹、char、short肮疗、int晶姊、float、long伪货、double)们衙、對象引用(reference類型)returnAddress類型(指向了一條字節(jié)碼指令的地址)。64位長度的longdouble類型會占用2個局部變量空間(Slot)碱呼,其余類型只占用1個
  • 局部變量表所需的內(nèi)存空間在編譯期間完成分配蒙挑,方法運行期間不會改變局部變量表的大小。
  1. 動態(tài)連接:每個棧幀都包含一個指向運行時常量池(方法區(qū)的一部分)中該棧幀所屬方法的引用愚臀。持有這個引用是為了支持方法調(diào)用過程中的動態(tài)連接忆蚀。Class文件的常量池中有大量的符號引用,字節(jié)碼中的方法調(diào)用指令就以常量池中指向方法的符號引用為參數(shù)姑裂。這些符號引用一部分會在類加載階段或第一次使用的時候轉(zhuǎn)化為直接引用馋袜,這種轉(zhuǎn)化稱為靜態(tài)解析。另一部分將在每一次的運行期間轉(zhuǎn)化為直接應用舶斧,這部分稱為動態(tài)連接欣鳖。
  2. 方法出口:返回方法被調(diào)用的位置,恢復上層方法的局部變量和操作數(shù)棧茴厉,如果無返回值观堂,則把它壓入調(diào)用者的操作數(shù)棧。
  • 如果單個線程請求棧深度大于虛擬機所允許的深度(-Xss)呀忧,將拋出StackOverflowError
  • 如果啟動一個新線程沒有足夠分配空間师痕,也無法擴展時,會拋出OutOfMemoryError

六而账,本地方法棧(Native Method Stacks)

  • 虛擬機棧為執(zhí)行Java方法(也就是字節(jié)碼)服務胰坟,而本地方法棧為Native方法服務。
  • 線程私有
  • 與虛擬機棧一樣,本地方法棧區(qū)域也會拋出StackOverflowErrorOutOfMemoryError

七笔横,程序計數(shù)器(Program Counter Register)

程序計數(shù)器是一塊較小的內(nèi)存空間竞滓,它的作用是當前線程所執(zhí)行的字節(jié)碼的行號指示器

  1. 線程私有吹缔,各條線程之間的計數(shù)器互不影響商佑,獨立存儲。
  2. 在任何一個確定的時刻厢塘,一個處理器都只會執(zhí)行一條線程中的指令茶没。
  3. 如果正在執(zhí)行java方法,計數(shù)器記錄的是正在執(zhí)行的虛擬機字節(jié)碼指令地址晚碾。
  4. 如果是native方法抓半,則計數(shù)器值為空(native 方法 指得就是Java程序調(diào)用了非Java代碼,算是一種引入其它語言程序的接口)格嘁。
  5. 唯一在Java虛擬機規(guī)范中沒有OutOfMemoryError的區(qū)域笛求。

例子

import java.text.SimpleDateFormat;
import java.util.Date;
import org.apache.log4j.Logger;
 
public class HelloWorld {
    private static Logger LOGGER = Logger.getLogger(HelloWorld.class.getName());
    public void sayHello(String message) {
        SimpleDateFormat formatter = new SimpleDateFormat("dd.MM.YYYY");
        String today = formatter.format(new Date());
        LOGGER.info(today + ": " + message);
    }
}

這段程序的數(shù)據(jù)在內(nèi)存中的存放如下:


JUtH_20121024_RuntimeDataAreas_4_MemoryModel.png

八、對象的創(chuàng)建

  • 虛擬機遇到new指令時
  1. 首先檢查這個指令的參數(shù)能否在常量池中定位到一個類的符號引用糕簿,并且檢查引用代表的類是否已被加載探入、解析和初始化過。如果沒有懂诗,則執(zhí)行類加載過程(第7章 虛擬機類加載機制)新症。
  2. 加載檢查通過后,分配內(nèi)存(內(nèi)存在類加載完成后便可完全確定)响禽。
  3. 內(nèi)存分配完成后徒爹,虛擬機對對象進行必要的設置,如對象是哪個類的實例芋类、如何找到類的元數(shù)據(jù)信息等(都放在對象的對象頭中)隆嗅。
  4. 從虛擬機角度看,一個新的對象產(chǎn)生了侯繁,但從java程序視角看胖喳,對象創(chuàng)建才剛剛開始,因為<init>方法還沒有執(zhí)行贮竟,所有字段為零丽焊。執(zhí)行new指令之后會接著執(zhí)行<init>方法(構造方法),進行初始化咕别,這樣一個真正可用的對象才算完成產(chǎn)生技健。

九、對象的內(nèi)存布局

對象在內(nèi)存中存儲的布局可以分為3塊區(qū)域:對象頭惰拱、實例數(shù)據(jù)雌贱、對齊填充

  • 對象頭(Header)包含兩部分
  1. 對象的運行時數(shù)據(jù),如哈希碼、GC分代年齡等欣孤。長度在32位和64位的虛擬機中馋没,分別為32bit、 64bit,官方稱它為Mark Word降传。
    對象mark word.PNG
  2. 類型指針篷朵,對象指向它的類元數(shù)據(jù)的指針,虛擬機通過這個指針來確定這個對象是哪個類的實例婆排。
  3. 注:如果對象是一個java數(shù)組声旺,對象頭中還必須有一塊記錄數(shù)據(jù)長度的數(shù)據(jù)
  • 實例數(shù)據(jù)(InstanceData)
    對象真正存儲的有用信息,各種類型的字段內(nèi)容泽论,包括父類繼承的和子類定義的字段
  • 對齊填充(Padding)
    由于HotSpot虛擬機要求對象的起始地址必須是8字節(jié)的整數(shù)倍,就是對象大小必須是8字節(jié)的整數(shù)倍卡乾。對象頭正好是8字節(jié)的倍數(shù)翼悴。當實例數(shù)據(jù)部分沒有對齊時,需要通過對齊填充來補全幔妨。

十鹦赎、對象的訪問定位

  1. Java程序通過棧上的reference數(shù)據(jù)來操作堆上的具體對象。
  2. 目前主流的對象訪問方式有兩種:使用句柄和直接指針误堡。
  3. 使用句柄 是間接訪問古话,優(yōu)點是reference中存儲的是穩(wěn)定的句柄地址,對象移動時只會改變句柄中的實例數(shù)據(jù)指針锁施。


    句柄訪問.PNG
  4. 使用直接指針 是直接訪問陪踩,優(yōu)點就是速度快。


    指針直接訪問.PNG

參考資料
https://segmentfault.com/a/1190000010412582
http://www.ityouknow.com/jvm/2017/08/25/jvm-memory-structure.html
http://www.reibang.com/p/3fecd4286f78

?著作權歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末悉抵,一起剝皮案震驚了整個濱河市肩狂,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌姥饰,老刑警劉巖傻谁,帶你破解...
    沈念sama閱讀 217,277評論 6 503
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異列粪,居然都是意外死亡审磁,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,689評論 3 393
  • 文/潘曉璐 我一進店門岂座,熙熙樓的掌柜王于貴愁眉苦臉地迎上來态蒂,“玉大人,你說我怎么就攤上這事费什〕悦剑” “怎么了?”我有些...
    開封第一講書人閱讀 163,624評論 0 353
  • 文/不壞的土叔 我叫張陵,是天一觀的道長赘那。 經(jīng)常有香客問我刑桑,道長,這世上最難降的妖魔是什么募舟? 我笑而不...
    開封第一講書人閱讀 58,356評論 1 293
  • 正文 為了忘掉前任祠斧,我火速辦了婚禮,結果婚禮上拱礁,老公的妹妹穿的比我還像新娘琢锋。我一直安慰自己,他們只是感情好呢灶,可當我...
    茶點故事閱讀 67,402評論 6 392
  • 文/花漫 我一把揭開白布吴超。 她就那樣靜靜地躺著,像睡著了一般鸯乃。 火紅的嫁衣襯著肌膚如雪鲸阻。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,292評論 1 301
  • 那天缨睡,我揣著相機與錄音鸟悴,去河邊找鬼。 笑死奖年,一個胖子當著我的面吹牛细诸,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播陋守,決...
    沈念sama閱讀 40,135評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼震贵,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了水评?” 一聲冷哼從身側(cè)響起屏歹,我...
    開封第一講書人閱讀 38,992評論 0 275
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎之碗,沒想到半個月后蝙眶,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,429評論 1 314
  • 正文 獨居荒郊野嶺守林人離奇死亡褪那,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,636評論 3 334
  • 正文 我和宋清朗相戀三年幽纷,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片博敬。...
    茶點故事閱讀 39,785評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡友浸,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出偏窝,到底是詐尸還是另有隱情收恢,我是刑警寧澤武学,帶...
    沈念sama閱讀 35,492評論 5 345
  • 正文 年R本政府宣布,位于F島的核電站伦意,受9級特大地震影響火窒,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜驮肉,卻給世界環(huán)境...
    茶點故事閱讀 41,092評論 3 328
  • 文/蒙蒙 一熏矿、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧离钝,春花似錦票编、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,723評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至浪读,卻和暖如春昔榴,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背瑟啃。 一陣腳步聲響...
    開封第一講書人閱讀 32,858評論 1 269
  • 我被黑心中介騙來泰國打工论泛, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留揩尸,地道東北人蛹屿。 一個月前我還...
    沈念sama閱讀 47,891評論 2 370
  • 正文 我出身青樓,卻偏偏與公主長得像岩榆,于是被迫代替她去往敵國和親错负。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 44,713評論 2 354

推薦閱讀更多精彩內(nèi)容

  • 第二部分 自動內(nèi)存管理機制 第二章 java內(nèi)存異常與內(nèi)存溢出異常 運行數(shù)據(jù)區(qū)域 程序計數(shù)器:當前線程所執(zhí)行的字節(jié)...
    小明oh閱讀 1,164評論 0 2
  • JVM整體組成 類加載器執(zhí)行引擎運行時數(shù)據(jù)區(qū)本地接口??程序在執(zhí)行之前先要把java代碼轉(zhuǎn)換成字節(jié)碼(class文...
    小胖er閱讀 624評論 0 0
  • 這篇文章是我之前翻閱了不少的書籍以及從網(wǎng)絡上收集的一些資料的整理勇边,因此不免有一些不準確的地方犹撒,同時不同JDK版本的...
    高廣超閱讀 15,599評論 3 83
  • 第6章類文件結構 6.1 概述 6.2 無關性基石 6.3 Class類文件的結構 java虛擬機不和包括java...
    kennethan閱讀 931評論 0 2