《深入理解Java虚拟机》(二)Java虚拟机运行时数据区
生活随笔
收集整理的這篇文章主要介紹了
《深入理解Java虚拟机》(二)Java虚拟机运行时数据区
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
Java虛擬機運行時數據區 詳解
2.1 概述
本文參考的是周志明的 《深入理解Java虛擬機》第二章 ,為了整理思路,簡單記錄一下,方便后期查閱。
2.2 運行時數據區域
Java虛擬機在Java程序運行時會將內存區域劃分成若干個不同的區域,各自負責不同的職責,這些區域都有各自的用途。
2.2.1 程序計數器
程序計數器是一塊較小的內存空間,可以看作當前線程所執行的字節碼行號指示器。需要注意以下幾點內容:
2.2.2 java虛擬機棧
- 可通過參數 棧幀是方法運行期的基礎數據結構棧容量可由-Xss設置
- 局部變量表:32位變量槽,存放了編譯期可知的各種基本數據類型、對象引用、returnAddress類型。
- 操作數棧:基于棧的執行引擎,虛擬機把操作數棧作為它的工作區,大多數指令都要從這里彈出數據、執行運算,然后把結果壓回操作數棧。
- 動態連接:每個棧幀都包含一個指向運行時常量池(方法區的一部分)中該棧幀所屬方法的引用。持有這個引用是為了支持方法調用過程中的動態連接。Class文件的常量池中有大量的符號引用,字節碼中的方法調用指令就以常量池中指向方法的符號引用為參數。這些符號引用一部分會在類加載階段或第一次使用的時候轉化為直接引用,這種轉化稱為靜態解析。另一部分將在每一次的運行期間轉化為直接應用,這部分稱為動態連接
- 方法出口:返回方法被調用的位置,恢復上層方法的局部變量和操作數棧,如果無返回值,則把它壓入調用者的操作數棧。
java虛擬機棧,規定了兩種異常狀況:
2.2.3 本地方法棧
- 可通過參數 棧容量可由-Xss設置
2.2.4 java堆
- 可通過參數?-Xms 初始堆大小和-Xmx 最大堆大小-Xmn 新生代` 設置
Java堆為了便于更好的回收和分配內存,可以細分為,新生代和老年代
**再細致一點的有Eden空間、From Survivor空間、To Survivor區**。- 新生代:包括Eden區、From Survivor區、To Survivor區,系統默認大小Eden:Survivor=8:1:1。
- 老年代:在年輕代中經歷了N次垃圾回收后仍然存活的對象,就會被放到老年代中。因此,可以認為老年代中存放的都是一些生命周期較長的對象。
- 據Java虛擬機規范的規定,當方法區無法滿足內存分配需求時,將拋出OutOfMemoryError異常。
2.2.5 方法區
- 可通過參數-XX:MaxPermSize設置
2.2.6 運行時常量池
- 可通過參數-XX:PermSize和-XX:MaxPermSize設置
- 常量池(Constant Pool):常量池數據編譯期被確定,是Class文件中的一部分。存儲了類、方法、接口等中的常量,當然也包括字符串常量。
- 字符串池/字符串常量池(String Pool/String Constant Pool):是常量池中的一部分,存儲編譯期類中產生的字符串類型數據。
- 運行時常量池(Runtime Constant Pool):方法區的一部分,所有線程共享。虛擬機加載Class后把常量池中的數據放入到運行時常量池。常量池:可以理解為Class文件之中的資源倉庫,它是Class文件結構中與其他項目資源關聯最多的數據類型。
- JDK1.6之前字符串常量池位于方法區之中。
- JDK1.7字符串常量池已經被挪到堆之中。
2.2.7 直接內存
- 可通過-XX:MaxDirectMemorySize指定,如果不指定,則默認與Java堆的最大值(-Xmx指定)一樣。
- 直接內存(Direct Memory)并不是虛擬機運行時數據區的一部分,也不是Java虛擬機規范中定義的內存區域,但是這部分內存也被頻繁地使用,而且也可能導致OutOfMemoryError異常出現。
2.3 hotspot虛擬機對象探秘
2.3.1 對象的創建
- 主要探討HotSpot虛擬機在Java堆中對象分配、布局和訪問的全過程
- 虛擬機遇到new指令時
2.3.2 對象的內存布局
對象在內存中存儲的布局可以分為3塊區域:對象頭、實例數據、對齊填充
對象頭包含兩部分(Header)
- 存儲對象自身的?運行時數據,如哈希碼、GC分代年齡等。長度在32位和64位的虛擬機中,分別為32bit、 64bit,官方稱它為“Mark Word”。
- 類型指針,對象指向它的類元數據的指針,虛擬機通過這個指針來確定這個對象是哪個類的實例。
注:如果對象是一個java數組,對象頭中還必須有一塊記錄數據長度的數據
實例數據(InstanceData)
- 對象真正存儲的有用信息,也是程序中定義的各種類型的字段內容。
對齊填充(Padding)
- 由于HotSpot虛擬機要求對象的起始地址必須是8字節的整數倍,通俗的說,就是對象大小必須是8字節的整數倍。對象頭正好是8字節的倍數。當實例數據部分沒有對齊時,需要通過對齊填充來補全。
2.3.3 對象的訪問定位
最后上一張本章結構圖
圖片來源于網絡如有侵權請私信刪除
?
轉至:https://segmentfault.com/a/1190000010412582
轉載于:https://www.cnblogs.com/caolei715/p/9174308.html
總結
以上是生活随笔為你收集整理的《深入理解Java虚拟机》(二)Java虚拟机运行时数据区的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: python __init__ 构造函
- 下一篇: CentOS7,zabbix3.4通过,