2010-03-23 67 views
17

是否有一個估算BigDecimal消耗的內存量的指導原則?Java BigDecimal內存使用情況?

尋找類似於這些guidelines的東西來估計String的內存使用情況。

+0

與更大的常數大致相同。當然,就像'String'一樣,它依賴於實現。 – 2010-03-23 15:35:59

+0

你讀過這個:http://www.javaworld.com/javaworld/javatips/jw-javatip130.html – PeterMmm 2010-03-23 15:47:09

回答

17

如果你看一下在源BigDecimal的領域有:

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 +? 

爲stringCache的一句話,就是「用來存儲的規範化字符串表示,如果計算出來。」,所以假設你不t調用toString,我們會將它保留爲零字節,所以總共有BigDecimal中的(8 + 4 + 4)= 16字節+ BigInteger和BigInteger中的4 + 4 + 4 + 4 + 4 = 20字節+ mag。所以總共有36個字節加上這個數量級。據我所知,幅度始終是表示整個整數所需的最小位數,因此對於數字n,它將需要log2(n)位,可將其轉換爲整數。所以一般你應該使用約:

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

(注意,這不包括任何其他的對象描述符的開銷,因爲你的榜樣鏈接,串並,但它應該給你一個很好的總體思路。)

+0

請記住,'stringCache'和'intVal'將具有引用指針(依賴於4或8字節的jvm impl)。還要記住最小12字節對象頭部開銷('BigInteger'和'BigDecimal',int []),最後8byte對齊(舍入)所有對象大小。 – 2014-01-25 17:07:46

+0

s/Cieling /天花板/ – thisfred 2014-11-10 20:05:00

3

如果你深入到BigDecimal的內部,你會發現它使用緊湊的表示形式,如果有效數是< = Long.MAX_VALUE。因此,內存使用情況可能會因您所代表的實際值而異。

+0

緊湊型表示是什麼? – 2010-03-23 15:45:41