2010-03-23 14 views
17

¿Existe una guía para estimar la cantidad de memoria consumida por un BigDecimal?Uso de la memoria Java BigDecimal?

Buscando algo similar a estos guidelines para estimar String uso de memoria.

+0

Casi lo mismo con una constante más grande. Por supuesto, como 'String', depende de la implementación. –

+0

¿Has leído este: http://www.javaworld.com/javaworld/javatips/jw-javatip130.html – PeterMmm

Respuesta

17

Si nos fijamos en los campos de la fuente de BigDecimal existe:

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

El comentario para stringCache "se utiliza para almacenar la representación de cadena canónica, si se calcula.", Por lo que suponiendo que usted don' Para llamar a String lo dejamos como cero bytes, por lo que en total hay (8 + 4 + 4) = 16 bytes + BigInteger en BigDecimal y 4 + 4 + 4 + 4 + 4 = 20 bytes + mag para BigInteger. Entonces un total de 36 bytes más la magnitud. Por lo que puedo decir, la magnitud es siempre el número mínimo de bits necesarios para representar el entero completo, por lo que para un número n necesitará log2 (n) bits, que se pueden convertir en enteros. Así que, en general, usted debe utilizar sobre: ​​

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

(tenga en cuenta que esto no incluye ninguno de los otros gastos generales descriptor de objeto como su ejemplo de enlace para las cadenas no, pero debe darle una buena idea general.)

+0

Tenga en cuenta que 'stringCache' e 'intVal' tendrán punteros de referencia (jvm impl depende de 4 u 8 bytes). Recuerde también la tara del encabezado del objeto mínimo de 12 bytes ('BigInteger' y 'BigDecimal', int []) y finalmente 8byte alinean (redondean) todos los tamaños de objeto. –

+0

s/Cieling/Techo / – thisfred

3

Si profundiza en las partes internas de BigDecimal, verá que utiliza una representación compacta si el significado es < = Long.MAX_VALUE. Por lo tanto, el uso de la memoria puede variar según los valores reales que está representando.

+0

¿Qué es la representación compacta? –

Cuestiones relacionadas