計(jì)算前提
JDK 版本,不同版本的類可能會(huì)有變化
要區(qū)分是 32bit 還是 64bit 系統(tǒng)
是否開啟壓縮指針(默認(rèn)開啟,指針為 4Byte,否則為 8Byte)
是否數(shù)組,數(shù)組對(duì)象頭多了一個(gè)長度值,占 4Byte
計(jì)算方法對(duì)象所占內(nèi)存 = 對(duì)象頭 + 所有域 + 填充
其中,若域?yàn)榱硪粋€(gè)對(duì)象,即非基本類型,則需遞歸計(jì)算
對(duì)象頭分為3部分:
mark word:同步狀態(tài)、GC狀態(tài)、hashcode 等
klass pointer: 指向本身的類對(duì)象
數(shù)組類型的長度
_mark | _kclass | Array Length | |
---|---|---|---|
32bit | 4 | 4 | 4 |
64bit | 8 | 8 | 4 |
64+comp | 8 | 4 | 4 |
https://mechanical-sympathy.blogspot.com/2011/07/false-sharing.html
http://openjdk.java.net/groups/hotspot/docs/HotSpotGlossary.html
// 32 bits: // -------- // hash:25 ------------>| age:4 biased_lock:1 lock:2 (normal object) // JavaThread*:23 epoch:2 age:4 biased_lock:1 lock:2 (biased object) // size:32 ------------------------------------------>| (CMS free block) // PromotedObject*:29 ---------->| promo_bits:3 ----->| (CMS promoted object) // // 64 bits: // -------- // unused:25 hash:31 -->| unused:1 age:4 biased_lock:1 lock:2 (normal object) // JavaThread*:54 epoch:2 unused:1 age:4 biased_lock:1 lock:2 (biased object) // PromotedObject*:61 --------------------->| promo_bits:3 ----->| (CMS promoted object) // size:64 ----------------------------------------------------->| (CMS free block) // // unused:25 hash:31 -->| cms_free:1 age:4 biased_lock:1 lock:2 (COOPs && normal object) // JavaThread*:54 epoch:2 cms_free:1 age:4 biased_lock:1 lock:2 (COOPs && biased object) // narrowOop:32 unused:24 cms_free:1 unused:4 promo_bits:3 ----->| (COOPs && CMS promoted object) // unused:21 size:35 -->| cms_free:1 unused:7 ------------------>| (COOPs && CMS free block)
http://hg.openjdk.java.net/jdk8u/jdk8u/hotspot/file/87ee5ee27509/src/share/vm/oops/markOop.hpp#l29
對(duì)象的域在內(nèi)存中的順序:域的順序并不是在類中定義的順序,而是經(jīng)過了調(diào)整;每個(gè)對(duì)象都是 8Byte 對(duì)齊的,不是倍數(shù)的話會(huì)在最后填充,具體順序如下:
doubles (8) and longs (8)
ints (4) and floats (4)
shorts (2) and chars (2)
booleans (1) and bytes (1)
references (4/8)
repeat for sub-class fields
https://zeroturnaround.com/rebellabs/dangerous-code-how-to-be-unsafe-with-java-classes-objects-in-memory/5/
不同域的大小Bytes | |
---|---|
boolean | 1 |
byte | 1 |
char | 2 |
short | 2 |
int | 4 |
float | 4 |
long | 8 |
double | 8 |
reference | 4 |
64bit 壓縮指針 JDK8 中 String s = "abc",對(duì)象 s 的大小: 48Bytes
注意:不同版本的 JDK String 類的域不同,比如 JDK6 中有 offset、count,JDK7 中有 hash32。
具體驗(yàn)證可以使用 jol 庫:
http://openjdk.java.net/projects/code-tools/jol/
System.out.println(GraphLayout.parseInstance("abc").toPrintable()); ==> java.lang.String@2ff4acd0d object externals: ADDRESS SIZE TYPE PATH VALUE 795707020 24 java.lang.String (object) 795707038 24 [C .value [a, b, c]
Welcome to my Blog
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://specialneedsforspecialkids.com/yun/68297.html
摘要:對(duì)于不同的實(shí)現(xiàn),對(duì)象占用的內(nèi)存空間大小可能不盡相同,本文主要分析中的情況,實(shí)驗(yàn)環(huán)境為位系統(tǒng),使用進(jìn)行結(jié)論驗(yàn)證。內(nèi)存占用這里分析一個(gè)只有一組鍵值對(duì)的結(jié)構(gòu)如下首先分析本身的大小。 本文深入分析并驗(yàn)證了不同Java對(duì)象占用內(nèi)存空間大小的情況。對(duì)于不同的jvm實(shí)現(xiàn),Java對(duì)象占用的內(nèi)存空間大小可能不盡相同,本文主要分析HotSpot jvm中的情況,實(shí)驗(yàn)環(huán)境為64位window10系統(tǒng)、JD...
摘要:加載圖的機(jī)制是什么,為何不會(huì)內(nèi)存泄漏自定義可拖動(dòng)的顯示高清大圖的技術(shù)博客大總結(jié)提供一個(gè)設(shè)置圖片的入口,里面去獲得圖片的真實(shí)的寬度和高度,以及初始化我們的重寫,在里面根據(jù)用戶移動(dòng)的手勢(shì),去更新顯示區(qū)域的參數(shù)。 目錄介紹 7.0.0.1 加載bitmap圖片的時(shí)候需要注意什么?為何bitmap容易造成OOM?如何計(jì)算Bitmap占用內(nèi)存? 7.0.0.2 如何理解recycle釋放內(nèi)存問...
摘要:本文詳細(xì)描述了堆內(nèi)存模型,垃圾回收算法以及處理內(nèi)存泄露的最佳方案,并輔之以圖表,希望能對(duì)理解內(nèi)存結(jié)構(gòu)有所幫助。該區(qū)域也稱為內(nèi)存模型的本地區(qū)。在中,內(nèi)存泄露是指對(duì)象已不再使用,但垃圾回收未能將他們視做不使用對(duì)象予以回收。 本文詳細(xì)描述了 Java 堆內(nèi)存模型,垃圾回收算法以及處理內(nèi)存泄露的最佳方案,并輔之以圖表,希望能對(duì)理解 Java 內(nèi)存結(jié)構(gòu)有所幫助。原文作者 Sumith Puri,...
摘要:第一個(gè)大陡坡是應(yīng)用發(fā)布,老年代內(nèi)存占比下降,很正常。但此時(shí)老年代內(nèi)存使用占比。因?yàn)楹笃诓⒉粫?huì)引發(fā)。可以看出,由于到達(dá)時(shí)候,觸發(fā)了一次和一次。但觸發(fā)時(shí),占比并沒用明顯的規(guī)律。得出,擴(kuò)容導(dǎo)致這個(gè)說法,其實(shí)是不準(zhǔn)確的。 轉(zhuǎn)載請(qǐng)注明原文鏈接:https://www.jianshu.com/p/468... 某天早上,毛老師在群里問「cat 上怎么看 gc」。 showImg(https://...
摘要:由于的自動(dòng)內(nèi)存管理系統(tǒng)要求對(duì)象起始地址必須是字節(jié)的整數(shù)倍,換句話說,就是對(duì)象的大小必須是字節(jié)的整數(shù)倍。對(duì)象大小計(jì)算要點(diǎn)在位系統(tǒng)下,存放指針的空間大小是字節(jié),是字節(jié),對(duì)象頭為字節(jié)。靜態(tài)屬性不算在對(duì)象大小內(nèi)。 jvm系列 垃圾回收基礎(chǔ) JVM的編譯策略 GC的三大基礎(chǔ)算法 GC的三大高級(jí)算法 GC策略的評(píng)價(jià)指標(biāo) JVM信息查看 GC通用日志解讀 jvm的card table數(shù)據(jù)結(jié)構(gòu) Ja...
閱讀 3236·2021-11-24 10:43
閱讀 4197·2021-11-24 10:33
閱讀 3771·2021-11-22 09:34
閱讀 2125·2021-10-11 10:58
閱讀 3732·2021-10-11 10:58
閱讀 859·2021-09-27 13:36
閱讀 3579·2019-08-30 15:54
閱讀 2965·2019-08-29 18:41