【问题标题】:How to find Object's size (including contained objects) [duplicate]如何查找对象的大小(包括包含的对象)[重复]
【发布时间】:2013-05-28 18:00:21
【问题描述】:

我想估计一个对象占用的大小。 要获取对象的大小,我可以使用

为此,我可能会使用Instrumentation.getObjectSize(myObject),但这会给我一个“浅”的尺寸。我想获取 Object 的大小,包括它引用的对象的大小。

我的想法是我需要获取对象的大小,然后遍历对象的所有非静态或原始字段,并获取它们指向的对象的大小并递归执行此操作。

当然,我不想多次计算对象大小,或者陷入循环,所以我必须记住我们已经计算过大小的对象。

有没有更快或更标准的方法来做到这一点?

我的代码如下所示:

public static long getObjectSize(Object obj)
{
    return getObjectSize(obj, new HashSet<Object>());
}

private static long getObjectSize(Object obj, Set<Object> encountered)
{
    if (encountered.contains(obj))
    {
        // if this object was already counted - don't count it again
        return 0;
    }
    else
    {
        // remember to not count this object's size again
        encountered.add(obj);
    }
    java.lang.reflect.Field fields[] = obj.getClass().getFields();
    long size = Instrumentation.getObjectSize(obj);
    // itereate through all fields               
    for (Field field : fields)
    {
        Class fieldType = field.getType();
        // only if the field isn't a primitive
         if (fieldType != Boolean.class &&
             fieldType != Integer.class &&
             fieldType != Long.class &&
             fieldType != Float.class &&
             fieldType != Character.class &&
             fieldType != Short.class &&
             fieldType != Double.class)
         {
             // get the field's value
             try
             {
                 Object fieldValue = field.get(obj);
                 size += getObjectSize(obj, encountered);
             } 
             catch (IllegalAccessException e) {}
         }
    }
    return size;
}

【问题讨论】:

标签: java object memory size


【解决方案1】:

尝试序列化对象然后获取序列化生成的字节流的大小。如果你想知道持久化对象的大小。

 public static byte[] serialize(Object obj) throws IOException {
    ByteArrayOutputStream baos = new ByteArrayOutputStream();
    ObjectOutputStream oos = new ObjectOutputStream(baos);
    oos.writeObject(obj);
    return baos.toByteArray();
}

【讨论】:

  • 这是推荐的做法吗?有替代品吗?
  • 我认为这是最准确的方法,因为序列化是一个对象结构的 byte per byte 表示,在最坏的情况下它会告诉你一个大小比真实的大一点,但不能更小,这可能会导致大小限制问题(最好留一些空间而不是超过它)。您还不如添加“浅”对象大小(您通过检测类获得的)以了解加载到 RAM 中的对象的总大小,这当然会使每个原始对象的大小加倍,因为它们本身就是参考达到自己的价值。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-03-15
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多