2013-06-02 25 views
9

Nesne tarafından alınan boyutu tahmin etmek istiyorum. yüzden sadece Instrumentation.getObjectSize(myObject) kullanabilir yapmak içinNesne boyutu (dahil olan nesneler dahil) nasıl bulunur?

kullanabilirsiniz nesnenin boyutunu elde etmek için, ama bu bana "sığ" boyutunu verecektir. Başvurduğu nesnelerin boyutları da dahil olmak üzere Nesnenin boyutunu almak istiyorum.

Düşüncem şu ki, nesnenin boyutunu elde etmem gerekiyor, sonra tüm nesnenin statik veya ilkel olmayan alanlarını geçiyor ve işaret ettikleri nesnelerin boyutunu bulup yinelemeli olarak yapıyorlar.

Elbette, bir nesne boyutunu birkaç kez saymak ya da bir döngüye takılmak istemiyorum. Bu yüzden, zaten saydığımız boyuttaki nesneleri hatırlamak zorundayım.

Bunu yapmak için daha hızlı veya daha standart bir yol var mı?

Benim kod şöyle görünür:

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

olası yinelenen [Java da, bir nesnenin boyutunu belirlemek için en iyi yolu nedir?] (Http://stackoverflow.com/questions/52353/in-java-what-is-the- bir nesnenin boyutunu belirlemek için en iyi yol) – jlordo

+0

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

cevap

5

deneyin nesnesi sonra serileştirme tarafından üretilen bayt akışından boyutunu almak seri hale getirmek için. Eğer kalıcı olduğunda nesnenin boyutunu bilmek istiyorsanız.

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

Bu önerilen bir uygulama mı? Alternatifler var mı? –

+0

Bence bu en doğru yöntemdir, çünkü serileştirme bir byte byte byte ** bir obje yapısının temsilidir, ve en kötü durumda size gerçek olandan biraz daha büyük bir boyut söyleyecektir, fakat boyut sınırlamalarına neden olabilecek daha küçüktür (bunu aşmak için biraz boşluk kalması daha iyidir). RAM'e yüklendikten sonra bir nesnenin toplam boyutunu bilmek için "sığ" nesne boyutunu (enstrümantasyon sınıfıyla aldığınız) eklemeniz gerekebilir. Bu, elbette her ilkel nesne için boyutu iki katına çıkarır çünkü bunlar kendileri referanstır kendi değerlerine. – arielnmz