2010-03-23 10 views
17

Esiste una linea guida per stimare la quantità di memoria consumata da un BigDecimal?Utilizzo della memoria Java BigDecimal?

Cercare qualcosa di simile a questi guidelines per stimare l'utilizzo della memoria String.

+0

Molto lo stesso con una costante più grande. Naturalmente, come 'String', dipende dall'implementazione. –

+0

Hai letto questo: http://www.javaworld.com/javaworld/javatips/jw-javatip130.html – PeterMmm

risposta

17

Se guardate i campi nella sorgente per BigDecimal c'è:

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

Il commento per stringCache è "Usato per memorizzare la rappresentazione di stringa canonica, se calcolata.", Assumendo così che don' t chiama toString lasciandolo come zero byte, quindi in totale ci sono (8 + 4 + 4) = 16 byte + BigInteger in BigDecimal e 4 + 4 + 4 + 4 + 4 = 20 byte + mag per BigInteger. Quindi un totale di 36 byte più la magnitudine. Per quanto ne so, la magnitudine è sempre il numero minimo di bit necessario per rappresentare l'intero intero, quindi per un numero n occorreranno i bit log2 (n), che possono essere convertiti in interi. Quindi, in generale, si dovrebbe utilizzare su:

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

(notare che questo non include nessuna delle altre spese oggetto descrittore come il vostro collegamento ad esempio per le stringhe non, ma dovrebbe darvi una buona idea generale.)

+0

Ricordare che 'stringCache' e 'intVal' avranno puntatori di riferimento (jvm impl dipendente da 4 o 8 byte). Ricorda anche l'overhead di intestazione dell'oggetto min 12byte ('BigInteger' e 'BigDecimal', int []) e infine 8byte allinea (arrotonda per eccesso) tutte le dimensioni degli oggetti. –

+0

s/Cieling/Soffitto / – thisfred

3

Se si scava nell'interno di BigDecimal vedrai che usa una rappresentazione compatta se il significato è < = Long.MAX_VALUE. Quindi, l'utilizzo della memoria può variare in base ai valori effettivi che si rappresentano.

+0

Qual è la rappresentazione compatta? –