2 回答

TA貢獻(xiàn)1856條經(jīng)驗(yàn) 獲得超17個(gè)贊
首先,Alexey Shipilev(Oracle 的前 JVM 工程師,現(xiàn)在在 Redhat)發(fā)表了一篇很棒的文章,解釋說這不是那么容易。
Java 中的每個(gè)對(duì)象都有兩個(gè)標(biāo)頭,它們的大小取決于平臺(tái)或 jvm 以 ( UseCompressedOops) 開頭的配置。
然后是字段和對(duì)象本身之間的填充和對(duì)齊(8 字節(jié)對(duì)齊)。然后,存在 JVM 根本不顯示的空間,因?yàn)樗荒芑虼_實(shí)需要。
所有這些使得計(jì)算某個(gè)對(duì)象在堆中有多少大小變得有些困難;幸運(yùn)的是JOL存在。它甚至還有很多樣本......這是一個(gè)小例子,假設(shè)你有這樣一個(gè)類:
static class MyValue {
private final int left;
private final String right;
public MyValue(int left, String right) {
this.left = left;
this.right = right;
}
}
然后你創(chuàng)建一個(gè)HashMap:
Map<String, MyValue> map = new HashMap<>();
System.out.println("empty map = " + GraphLayout.parseInstance(map).totalSize());
MyValue one = new MyValue(1, "one");
System.out.println("one = " + GraphLayout.parseInstance(one).totalSize());
map.put("one", one);
System.out.println("map after one = " + GraphLayout.parseInstance(map).totalSize());
MyValue two = new MyValue(1, "two");
map.put("two", two);
System.out.println("map after two = " +
GraphLayout.parseInstance(map).totalSize());

TA貢獻(xiàn)1828條經(jīng)驗(yàn) 獲得超3個(gè)贊
如果我的理解是正確的,你想知道并發(fā)HashMap的大小。我認(rèn)為,以下步驟可能會(huì)有所幫助。
創(chuàng)建一個(gè)后臺(tái)線程(不是前臺(tái))。
使用 ByteArrayOutputStream 序列化并發(fā) HashMap。
使用 toByteArray() 獲取字節(jié)數(shù)組。
最后以 kb/mb 為單位計(jì)算大小。
使用 Logger 記錄大小。
其他選項(xiàng)是使用像 JProfiler 這樣的探查器來查看對(duì)象圖及其大小。
添加回答
舉報(bào)