Chcę oszacować rozmiar zajmowany przez obiekt. Aby uzyskać rozmiar obiektu, mogę po prostu użyćJak znaleźć rozmiar obiektu (łącznie z zawartymi obiektami)?
Aby to zrobić, mogę użyć Instrumentation.getObjectSize(myObject)
, ale to da mi "płytkie" rozmiary. Chcę uzyskać rozmiar obiektu, w tym rozmiary obiektów, do których się odnosi.
Moja myśl jest taka, że potrzebuję uzyskać rozmiar obiektu, a następnie przejść przez wszystkie pola obiektu, które nie są statyczne lub prymitywne i uzyskać rozmiar dla obiektów, do których one wskazują i wykonywać to rekursywnie.
Oczywiście, nie chcę policzyć wielkości obiektu kilka razy, lub utknąć w pętli, więc będę musiał pamiętać obiekty, które już policzyliśmy.
Czy jest to szybszy lub bardziej standardowy sposób na zrobienie tego?
Mój kod wygląda następująco:
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;
}
możliwe duplikat [W języku Java, co jest najlepszym sposobem określenia rozmiaru obiektu?] (Http://stackoverflow.com/questions/52353/in-java-what-is-the- najlepszy-sposób-określić-rozmiaru-obiektu) – jlordo
https://code.google.com/p/memory-measurer/ https://github.com/twitter/commons/blob/master /src/java/com/twitter/common/objectsize/ObjectSizeCalculator.java –