2013-06-02 11 views
9

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; 
} 
+0

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

+0

https://code.google.com/p/memory-measurer/ https://github.com/twitter/commons/blob/master /src/java/com/twitter/common/objectsize/ObjectSizeCalculator.java –

Odpowiedz

5

Spróbuj serializacji obiektu następnie uzyskać rozmiaru strumienia bajtów generowanego przez serializacji. że jeśli chcesz znać rozmiar obiektu, gdy jest on utrwalony.

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

Czy jest to zalecana praktyka? Czy istnieją alternatywy? –

+0

Myślę, że jest to najdokładniejsza metoda, ponieważ serializacja to ** bajt na bajt ** reprezentacja struktury obiektu, aw najgorszym przypadku powie ci ona rozmiar nieco większy od rzeczywistego, ale nie mniejsze, co może powodować problemy z wielkością (lepiej zostawić trochę miejsca, niż go przekroczyć). Równie dobrze możesz dodać "mały" rozmiar obiektu (ten, który otrzymasz za pomocą klasy instrumentacji), aby poznać całkowity rozmiar obiektu po załadowaniu do pamięci RAM, to oczywiście podwaja rozmiar każdego obiektu pierwotnego, ponieważ one same są odniesieniami do ich własnej wartości. – arielnmz

Powiązane problemy