2 回答
TA贡献1856条经验 获得超17个赞
首先,Alexey Shipilev(Oracle 的前 JVM 工程师,现在在 Redhat)发表了一篇很棒的文章,解释说这不是那么容易。
Java 中的每个对象都有两个标头,它们的大小取决于平台或 jvm 以 ( UseCompressedOops) 开头的配置。
然后是字段和对象本身之间的填充和对齐(8 字节对齐)。然后,存在 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;
}
}
然后你创建一个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条经验 获得超3个赞
如果我的理解是正确的,你想知道并发HashMap的大小。我认为,以下步骤可能会有所帮助。
创建一个后台线程(不是前台)。
使用 ByteArrayOutputStream 序列化并发 HashMap。
使用 toByteArray() 获取字节数组。
最后以 kb/mb 为单位计算大小。
使用 Logger 记录大小。
其他选项是使用像 JProfiler 这样的探查器来查看对象图及其大小。
添加回答
举报