深入理解Java虛擬機(一): 內存區域

      網友投稿 692 2025-04-01

      運行時數據區域


      Java在運行時會把它所管理的內存劃分為若干個不同的數據區域。

      方法區(Method Area)

      (1)線程共享

      (2)存儲

      類信息

      常量

      靜態變量

      即時編譯器編譯后的代碼

      (3)非堆

      (4)不需要連續的內存

      (5)可以選擇固定或可擴展

      (6)可選擇不實現垃圾收集

      (7)針對常量池的回收

      運行時常量池(Runtime Constant Pool)

      a、常量池:存放編譯期生成的字面常量和符號引用

      b、這些常量池中的數據進入方法區后存放在運行時常量池中

      c、動態性:運行期可將新的常量放入池中,例如:String.intern()方法

      (8)對類型的卸載

      (9)無法滿足內存分配需求時會拋出OutOfMemoryError

      虛擬機棧(VM Stack)

      (1)線程私有

      (2)生命周期與線程相同

      (3)描述Java方法執行的內存模型

      (4)棧幀

      a、局部變量表:基本數據類型、對象引用和returnAddress類型(指向一條字節碼指令的地址)

      b、操作數棧

      c、動態鏈接

      d、方法出口

      e、64位的long 和double會占用兩個局部變量空間,其余的只占一個

      f、編譯期完成內存分配

      g、方法運行期間不會改變局部變量表的大小

      h、存儲

      i、入棧

      j、出棧

      (5)線程請求的棧深度大于虛擬機允許的深度會拋出StackOverFlowError

      (6)如果擴展時無法申請到足夠內存會拋出OutOfMemoryError

      本地方法棧(Native Method Stack)

      (1)為本地方法(Native Method)服務

      (2)<--> 區別于虛擬機棧:為虛擬機執行Java方法服務。

      (3)拋出StackOverFlowError

      (4)拋出OutOfMemoryError

      堆(Heap)

      (1)Java虛擬機所管理的內存中最大的一塊

      (2)線程共享

      (3)虛擬機啟動時創建

      (4)存放對象實例及數組

      (5)垃圾回收管理(GC)主要區域

      - 分代算法

      | 新生代

      eden

      from

      to

      | 老年代

      (6)可劃分出多個線程私有的分配緩沖區(Thread Local Allocation Buffer,TLAB)

      (7)可處于物理上不連續的內存空間,保證邏輯連續即可

      (8)可通過-Xmx和-Xms控制大小(可擴展)

      (9)堆無法再擴展時會拋出OutOfMemoryError

      程序計數器(Program Counter Register)

      (1)較小內存空間

      (2)當前線程的行號指示器

      (3)線程私有的內存

      (4)唯一一個沒有OutOfMemoryError的區域

      直接內存(Direct Memory)

      (1)NIO中使用基于通道(Channel)與緩沖區(Buffer)的I/O方式,使用Native函數庫直接分配的堆外內存

      (2)無法滿足內存分配需求時會拋出OutOfMemoryError

      對象的創建

      (1)類加載檢查機制

      (2)為新生對象分配內存

      (3)把一塊確定大小的內存從堆中劃分出來。

      選擇方式由Java堆是否規整決定

      Java堆是否規整由垃圾收集器是否帶有壓縮整理功能決定。

      由于對象創建是非常頻繁的,則在并發情況下不是線程安全的

      對分配內存空間的動作進行同步處理

      把內存分配的動作按照線程劃分在不同的空間中,即TLAB方式。

      只有在TLAB用完并分配新TLAB的情況下需要同步鎖定

      可以使用-XX:+/-UseTLAB來設定

      內存規整:?指針碰撞(Bump the Point)

      內存不規整?空閑列表(Free List):維護列表并記錄哪些是可用的。

      (4)將分配到的內存空間初始化為0(不包含對象頭)

      (5)對對象進行必要的設置

      (6)屬于哪個類的實例

      (7)如何找到類的元數據信息

      (8)對象的哈希值

      (9)對象的GC分代年齡

      (10)這些數據存放在對象頭(Object Header)中

      (11)對象得到創建,但是所有的字段為零,在執行new之后會立即執行方法

      對象的內存布局

      (1)對象頭(Object Header)

      深入理解Java虛擬機(一): 內存區域

      存儲對象自身運行時數據(Mark Word),通常在32位和64位的機器上占用32bit和64bit的空間

      哈希嗎

      GC分代年齡

      鎖狀態標志

      線程持有鎖

      偏向線程ID

      偏向時間戳

      (2)類型指針:?對象指向它的類元數據的指針

      a、虛擬機通過這個指針來確定這個對象屬于哪個類

      b、不是所有的對象實例都保留有類型指針

      c、如果對象是數組,還必須有一塊用于記錄數組長度的數據

      (3)實例數據(Instance Data),真正存儲的數據

      存儲順序受到虛擬機分配策略參數(Fields Allocation Style)和字段在Java源碼中的定義順序影響

      (4)對齊填充(Padding)

      a、不是必要存在的

      b、僅僅起占位作用

      對象訪問定位

      Java通過棧上的引用(reference)數據來操作堆上的具體對象

      句柄訪問

      (1)堆中劃分一塊內存作為句柄池

      (2)reference中存儲對象的句柄地址

      (3)句柄中包含對象實例數據與類型數據各自的具體地址信息

      優點:reference中存儲穩定的句柄地址,在對象移動時只會改變句柄中的實例數據指針

      直接指針

      (1)考慮如何放置訪問類型數據的相關信息

      (2)reference中直接存儲對象地址

      優點:速度更快,節省一次指針定位的時間

      本文轉載自微信公眾號【java學習之道】。

      Java 存儲

      版權聲明:本文內容由網絡用戶投稿,版權歸原作者所有,本站不擁有其著作權,亦不承擔相應法律責任。如果您發現本站中有涉嫌抄襲或描述失實的內容,請聯系我們jiasou666@gmail.com 處理,核實后本網站將在24小時內刪除侵權內容。

      版權聲明:本文內容由網絡用戶投稿,版權歸原作者所有,本站不擁有其著作權,亦不承擔相應法律責任。如果您發現本站中有涉嫌抄襲或描述失實的內容,請聯系我們jiasou666@gmail.com 處理,核實后本網站將在24小時內刪除侵權內容。

      上一篇:如何在Excel中按某個前綴過濾列數據
      下一篇:excel函數包含符號(excel函數中的符號大全)
      相關文章
      精品久久久久久亚洲| 亚洲黄色三级视频| 亚洲成亚洲乱码一二三四区软件| 久久精品国产亚洲AV未满十八| 亚洲午夜电影一区二区三区| 亚洲高清日韩精品第一区| 亚洲伦另类中文字幕| 久久人午夜亚洲精品无码区| 四虎必出精品亚洲高清| 亚洲情A成黄在线观看动漫软件| 亚洲人妖女同在线播放| 亚洲一级毛片中文字幕| 亚洲av无码专区在线| 亚洲伊人久久大香线蕉在观| www.亚洲成在线| 亚洲熟妇无码一区二区三区 | 亚洲第一综合天堂另类专 | 亚洲精品无码久久千人斩| 亚洲色偷偷偷鲁综合| 久久亚洲高清观看| 无码乱人伦一区二区亚洲一| 最新亚洲人成无码网站| 男人的天堂亚洲一区二区三区 | 亚洲av片在线观看| 亚洲专区先锋影音| 亚洲的天堂av无码| 亚洲jizzjizz在线播放久| 亚洲日韩一区精品射精| 亚洲国产亚洲综合在线尤物| 精品亚洲成A人无码成A在线观看| 亚洲中文字幕无码爆乳app| 男人的天堂av亚洲一区2区| 亚洲精品视频免费| 亚洲va久久久噜噜噜久久天堂| 亚洲精品免费观看| 亚洲一区二区三区免费视频| 亚洲爆乳无码专区www| 亚洲国产91精品无码专区| 国产精品亚洲色图| 亚洲AV综合永久无码精品天堂| 婷婷亚洲天堂影院|