IT/Java

long 과 Long 의 메모리 사용량

yjacket 2011. 8. 24. 22:50
Java 에서 long 은 primitive type, 즉, 원시형 데이터로 클래스가 아니다.
long 은 64bit 정수값을 표현하는 데이터 타입으로 8byte 의 메모리 공간을 사용한다.
Long 은 long 과 마찬가지로 64bit 정수 값을 표현하지만 이것은 클래스다.
그렇다면 Long 은 몇 byte 의 메모리 공간을 사용할까?
테스트를 위해 다음과 같은 코드를 작성해보자.

public class LongTest1
{
public static void main(String[] args)
{
int length = 10000000;
long[] ls = new long[length];
long l = 0;
for (int i = 0; i < length; i++)
ls[i] = l++;
System.out.println(Runtime.getRuntime().totalMemory() - Runtime.getRuntime().freeMemory());
}
}

위 테스트 클래스는 primitive type인 long을 사용해 배열을 작성하고, 메모리 사용량을 출력한다.

public class LongTest2
{
public static void main(String[] args)
{
int c = 10000000;
Long[] ls = new Long[length];
long l = 0;
for (int i = 0; i < length; i++)
ls[i] = new Long(l++);
System.out.println(Runtime.getRuntime().totalMemory() - Runtime.getRuntime().freeMemory());
}
}


위 테스트 클래스는 Long 클래스의 배열을 작성하고, 메모리 사용량을 출력한다.
 
아래는 heapsize를 최소 100MB, 최대 2GB로 지정한 VM에서 위 두 클래스의 c 값을 바꿔가며 실행한 결과다.


측정한 결과치는 32bit / 64bit VM 에서 각각 다르게 나왔는데, 배열 자체의 사용량을 측정한 것이 아니고 전체 VM의 메모리 사용량을 본 것이므로 long배열의 경우 차이가 없다고 해석 가능하지만, Long배열은 눈에 띄는 차이를 보였다.

아무튼 위 표의 측정치를 통해 long 은 8byte 를 사용하고, Long 은 32bit에선 약 20byte, 64bit 에선 약 28byte 를 사용한다고 볼 수 있다.

측정시 약간의 실수가 있었던것 같아 정정하자면 위 측정 결과는 아주 정확하다고 볼 수 없지만 heapdump 를 확인한 결과 측정결과와 거의 일치하므로 어느정도 신뢰 해도 될 듯 하다. (heapdump 에선 Long 의 메모리 사용량이 64bit 에서 24byte로 나왔다.)