我想估计一个对象占用的大小。要获得对象的大小,我可以使用
为此,我可能会使用Instrumentation.getObjectSize(myObject)
,但这会给我一个“浅”的尺寸。我想获取对象的大小,包括它引用的对象的大小。
我的想法是我需要获取对象的大小,然后遍历对象的所有非静态或原始字段,并获取它们指向的对象的大小并递归执行此操作。
当然,我不想多次计算对象大小,或者陷入循环,所以我必须记住我们已经计算过的对象大小。
有没有更快或更标准的方法来做到这一点?
我的代码如下所示:
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;
}