2015-06-11 19 views
6

C malloc uygulamaları genellikle istenen bellek miktarını tahsis etmez, bunun yerine sabit boyutlu bellek miktarlarını kullanır, örn. İki boyuttan güçle, 1025 baytlık bir ayırma aslında 2052 baytlık bir segmenti 1023 baytlık bir eğim olarak alır.Java dizileri HotSpot'ta (yani ne kadar slop) bellek kullanıyor?

HotSpot, Java dizileri için benzer bir ayırma mekanizması kullanıyor mu? Öyleyse, bir Java dizisini hiçbir slop olmadığı şekilde ayırmanın doğru yolu nedir? (Örn. Dizi uzunluğu iki veya belki iki eksi gücün sabit bir miktarının gücü olmalıdır?)

+8

Diyelim ki 1025 bayt depolamak için bir dizi ihtiyaç varsayalım (Cevapları nesne boyutu kontrol etmek için güvenli olmayan sınıfını kullanarak bir örnek ekleyin). Java'nın bu dizi için 2048 bayt bellek ayırdığını ve 1023 bayt kullanılmadan bırakıldığını varsayalım. 1025 bayt depolamak için 2048 baytlık bir dizi oluşturmada ne kazanırsınız? Şimdi, kullanılmayan 1023 byte'ları kendiniz işlemek ve dizinin gerçek uzunluğunu bir yerde saklamak ve JVM'nin sizin için yapmasına izin vermek yerine diziyi geçmek yerine argüman olarak iletmeniz gerekir. Ve tüketilen hafıza miktarı aynı olacaktır. Bu no-brainer. Bir diziyi ayırmanın doğru yolu, ihtiyacınız olan uzunlukta bir dizi ayırmaktır. –

+4

Dürüst olmak gerekirse, bir JVM uygulamasının belleği nasıl işlediğinden endişe etmem. Java gibi yönetilen bir dil kullanmanın sevinçleri, hafızanın sadece dev bir dizi olmaması, hiçbir zaman arabellek taşması ya da sınır dışı problemlerden ya da yol göstericilerinden kaynaklanan bellek bozulmasından endişelenmenize gerek yoktur. nesneyi temizlemek için endişelenmek. Kendinizi Java'nın zenine açın. – scottb

+2

'malloc', çöp toplayan bir dilin endişelenmesi gereken bir dizi kısıtlamaya sahiptir. Java'nın bu şeyler hakkında endişelenmesi gerektiğini düşünmezdim. –

cevap

5

Dil hakkında soru soruyorsanız, yanıt: Belirtilmemiş (C ile aynı)

Belirli bir uygulama hakkında soru soruyorsanız, uygulamaya bakın. Hotspot'un 8 baytlık granülaritesine inanıyorum; Bu nesne boyutları sonraki tanecikli sınırına yuvarlanır. Yeterli serbest yığın olmadığı zaman yığın boyutu artışı ile ilgili soru varsa, o zaman bu uygulama, GC ayarları, yığın boyutu paramları vb. kesin olarak cevap vermeyi imkansız kılıyor.

DÜZENLEME: Küçük bir yansıma kesmek kullanarak, sun.misc.Unsafe sınıfına erişme (yalnızca Oracle JRE), nesne başvuruları bellek adreslerine dönüştürülebilir; Kendinizi kontrol etmek için ardışık olarak ayrılmış iki dizinin adreslerini verin.

Ve temelde burada aynı soruyu sordu: Determine the optimal size for array with respect to the JVM's memory granularity

+0

Gerçekten denedim soruyu genel olarak Java yerine HotSpot hakkında sormak için formüle etmek. Ve diğer sorunun cevabına baktığımızda, cevabı en yakın 8 bayt sınırına yuvarlamak gibi görünüyor. Teşekkürler. – hsivonen

İlgili konular