2010-03-23 50 views
17

BigDecimal tarafından tüketilen bellek miktarını tahmin etmek için bir yönerge var mı?Java BigDecimal bellek kullanımı?

String bellek kullanımının tahmin edilmesi için bu guidelines benzeri bir şey mi arıyorsunuz.

+0

Aynı şey daha büyük bir sabit ile aynı. Elbette, 'String' gibi, uygulamaya bağımlıdır. –

+0

Bunu okudu mu: http://www.javaworld.com/javaworld/javatips/jw-javatip130.html – PeterMmm

cevap

17

vardır:

stringCache için comment "bilgisayarlı varsa, kurallı dize gösterimini depolamak için kullanılır." dır

, bu nedenle don' varsayarak

BigDecimal: 
    long intCompact +8 bytes 
    int precision +4 bytes 
    int scale +4 bytes 
    String stringCache +? 
    BigInteger intVal +? 

BigInteger: 
    int bitCount +4 bytes 
    int bitLength +4 bytes 
    int firstNonzeroIntNum +4 bytes 
    int lowestSetBit +4 bytes 
    int signum +4 bytes 
    int[] mag +? 
t toString'i sıfır bayt olarak bırakacağız, böylece toplamda BigDecimal'de (8 + 4 + 4) = 16 byte + BigInteger ve BigInteger için 4 + 4 + 4 + 4 + 4 = 20 bytes + mag. Yani toplam 36 bayt artı büyüklüğü. Büyüklüğü her zaman tam tamsayıyı temsil etmek için gereken minimum bit sayısı olduğunu söyleyebildiğim için, bir n sayısı için, intrlere dönüştürülebilen log2 (n) bitlerine ihtiyaç duyacaktır. Yani genel olarak yaklaşık kullanarak edilmelidir:

36 + Ceiling(log2(n)/8.0) bytes 

(bu ama size iyi bir genel bir fikir verecektir gelmez dizeleri için örnek bağlantı olarak diğer nesne tanımlayıcısı yükü herhangi içermez unutmayın.)

+0

'stringCache' ve 'intVal' öğelerinin referans işaretçilerine sahip olacağını unutmayın (jvm impl'ye bağımlı 4 veya 8 bayt). Ayrıca min 12byte nesne üstbilgisi ek yükünü ('BigInteger' ve 'BigDecimal', int []) ve son olarak 8byte tüm nesne boyutlarını hizalayın (yuvarlak). –

+0

s/Cieling/Tavan / – thisfred

3

BigDecimal iç yapısını içine kazarsanız, anlamlılık < = Long.MAX_VALUE ise kompakt bir gösterim kullandığını görürsünüz. Bu nedenle, bellek kullanımı, temsil ettiğiniz gerçek değerlere bağlı olarak değişebilir. Eğer BigDecimal için kaynağındaki alanlara bakarsak

+0

Kompakt sunum nedir? –