Docker 的優點
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)
存儲對象自身運行時數據(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小時內刪除侵權內容。