2010-03-23 2 views
17

BigDecimal에 의해 소비되는 메모리 양을 예측하기위한 가이드 라인이 있습니까?Java BigDecimal 메모리 사용?

String 메모리 사용량을 예상하여 guidelines과 (과) 비슷한 것을 찾고 있습니다.

+0

더 큰 상수와 거의 동일합니다. 물론,'String'과 마찬가지로 그것은 구현에 달려 있습니다. –

+0

이 책을 읽었습니까? http://www.javaworld.com/javaworld/javatips/jw-javatip130.html – PeterMmm

답변

17

가 :

stringCache에 대한 댓글이 "계산하면, 표준적인 캐릭터 라인 표현을 저장하는 데 사용"입니다.

, 그래서 당신은 '돈 가정

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 +? 
우리는 그것을 0 바이트로 남겨 둘 것이다. 그래서 BigInteger에 대해 (8 + 4 + 4) = 16 바이트 + BigInteger가 BigDecimal이고 4 + 4 + 4 + 4 + 4 = 20 바이트 + mag가된다. 총 36 바이트에 크기를 더한 값입니다. 내가 말할 수있는 한 절대 크기는 항상 전체 정수를 표현하는 데 필요한 최소 비트 수이므로 정수 n으로 변환하려면 int2로 변환 할 수있는 log2 (n) 비트가 필요합니다. 그래서 일반적으로 당신에 대한 사용한다 :

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

(이 있지만, 그것은 당신에게 좋은 일반적인 아이디어를 줄 것이다 않는 문자열에 대한 예를 링크로 다른 객체 기술자 오버 헤드 중 하나를 포함하지 않습니다.)

+0

'stringCache'및 'intVal'에는 참조 포인터 (jvm impl 종속 4 또는 8 바이트)가 있습니다. 또한 최소 12byte 객체 헤더 오버 헤드 ('BigInteger'및 'BigDecimal', int [])를 기억하고 모든 객체 크기를 8 바이트로 정렬 (반올림)합니다. –

+0

s/Cieling/Ceiling / – thisfred

3

BigDecimal의 내부를 파헤 치면 유효 숫자가 < = Long.MAX_VALUE 인 경우 압축 된 표현이 사용됩니다. 따라서 메모리 사용은 사용자가 나타내는 실제 값에 따라 달라질 수 있습니다. 당신의 BigDecimal의 소스의 필드를 보면

+0

간결한 표현이란 무엇입니까? –