2 回答

TA貢獻1856條經(jīng)驗 獲得超17個贊
首先,Alexey Shipilev(Oracle 的前 JVM 工程師,現(xiàn)在在 Redhat)發(fā)表了一篇很棒的文章,解釋說這不是那么容易。
Java 中的每個對象都有兩個標頭,它們的大小取決于平臺或 jvm 以 ( UseCompressedOops) 開頭的配置。
然后是字段和對象本身之間的填充和對齊(8 字節(jié)對齊)。然后,存在 JVM 根本不顯示的空間,因為它不能或確實需要。
所有這些使得計算某個對象在堆中有多少大小變得有些困難;幸運的是JOL存在。它甚至還有很多樣本......這是一個小例子,假設你有這樣一個類:
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)建一個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貢獻1828條經(jīng)驗 獲得超3個贊
如果我的理解是正確的,你想知道并發(fā)HashMap的大小。我認為,以下步驟可能會有所幫助。
創(chuàng)建一個后臺線程(不是前臺)。
使用 ByteArrayOutputStream 序列化并發(fā) HashMap。
使用 toByteArray() 獲取字節(jié)數(shù)組。
最后以 kb/mb 為單位計算大小。
使用 Logger 記錄大小。
其他選項是使用像 JProfiler 這樣的探查器來查看對象圖及其大小。
添加回答
舉報