一、內存佈局:
一個java對象在內存中可分爲3個區域:對象頭(Header)、實例數據(Instance Data)、對齊填充(Padding)。
- 對象頭(兩部分):
- 對象自身運行時的數據。如哈希碼、GC分代年齡、鎖狀態標誌、線程持有的鎖、偏向線程ID、偏向時間戳等。
- 類型指針。即對象指向它的類元數據的指針,虛擬機通過這個指針確定這個對象是哪個類的實例。對象的訪問定位就是通過這個來確認的,如後面的圖片所示。
- 實例數據:真正的有效數據。
- 對齊填充:沒有特殊含義,啓佔位符的作用。HotSpot VM的自動內存管理系統要求,對象大小必須是8字節的整數倍,也就是64位的整數倍。
二、對象的訪問定位:
三、思考:
搞技術的,學習技術的使用只是最淺的一層也是最容易變化的,最重要的是設計的思想,也是較少變化的。比如java對象的內存佈局,和http的請求就很類似,也是增加header部分,把數據運轉時的狀態和數據本身拆分開來。更深一層的來說,就是職責更加明確,類似的如面向對象設計的原則之一——單一職責,體現的也就是高內聚低耦合的思想,也就是小而美而不要大而全。(PS:你咋不說上升到哲學高度,萬事萬物道理相同呢。。。哈哈。。)