2010-10-27 8 views
8

Yığından ne kadar belleğin belirli bir türde yeni bir nesne oluşturmak için kullanılmasının ölçülmesinin doğru yolu nedir? (Integers hakkında basitçe konuşalım).Java'da bir Tamsayı nesnesi için ne kadar bellek ayrılmıştır? Herhangi bir özel nesne için bu değeri nasıl bulabilirim?

Bu değer deneme yapılmadan hesaplanabilir mi? Bu durumda kurallar neler? Bu kurallar kesinlikle bir yerde mi belirtiliyor yoksa jvm'den jvm'ye değişebilir mi? JVM'den JVM'ye değişebilir.

+0

Makineye göre farklılık göstermiyorlar ancak java'da hiçbir boyut kullanıcısı yok. Bu, – Cratylus

cevap

14

32 bit Hotspot JVM, 32 bit yük (bir Integer.value alanı) üzerinde bir Java Tamsayı durumunda

bir eşlik eder: Bir Oracle mühendisten this blog post gibi olabilir

Toplam 128 bit için 96 ek bit, bir işaret, bir klass ve bir hizalama dolgusu kelimesi. Dahası, eğer dünyadaki bu tamsayıya ilişkin altı referans (iş parçacığı artı yığın) varsa, bu referanslar toplam 320 bit için 192 bit içerir. 64 bitlik bir makinede, her şey en azından şu anda iki kat daha büyüktür: nesnede 256 bit (artık 96 bit dolgu içerir) ve başka yerlerde 384 bit. Buna karşılık, bir kutusuz ilkel tamsayı altı nüsha 192 bit

Java yapmak kolay değil
0

işgal: sizeof mevcut değildir ve böyle bir bayt akışı içine nesneleri seri ve oluşan akım baktığı gibi alternatif çözümler, uzunluk, her durumda çalışmaz (örneğin dizeler). Nesne grafiklerini kullanarak this quite complicated implementation numaralı belgeye bakın.

+1

sorusunu soruyorsa, muhtemelen bu konuya yanlışlıkla cevabınızı eklemişsinizdir :) – Roman

+0

@Roman, whoops, error edited :) –

1

Bunu bulmak için Java enstrümantasyonuna bakmak isteyebilirsiniz. Here, bunun bir örneğidir.

Sizin durumunuzda, uygulamanızla ilgili nesnelerin boyutunu bulmak istediğinize inandığınız için, uygulamadan erişebilmeniz için Instrumentation nesnesini global olarak (static) kullanıma hazır hale getireceksiniz. bağlantı kopyalanan

Kodu: Ancak

public class MyAgent { 
    private static volatile Instrumentation globalInstr; 
    public static void premain(String args, Instrumentation inst) { 
    globalInstr = inst; 
    } 
    public static long getObjectSize(Object obj) { 
    if (globalInstr == null) 
     throw new IllegalStateException("Agent not initted"); 
    return globalInstr.getObjectSize(obj); 
    } 
} 

, ben sadece nesneleri (değil ilkel türleri, aynı zamanda size bunları öğrenmek için gerekmez boyutunu bulmak mümkün olacağına inanıyoruz zaten getObjectSize() metodu geçirilen nesne tarafından başvurulan başka nesneler tarafından kullanılan bellek içermez) :-)

not onları tanımak. Örneğin, nesne bir Ob için bir başvuru varsa ject B, sonra Object A bildirilen bellek kullanımı, gerçek nesne değil, yalnızca Object B (genellikle 4 bayt) referansı için gereken baytları içerecektir.

("ana" bir nesne tarafından başvurulan "subobjects" veya nesneleri içeren ie) bir nesnenin bellek kullanımı bir "derin" sayımını almak için daha sonra beta indirilebilir Classmexer ajan kullanabilir this sitesinden.

İlgili konular