본문 바로가기

Programing/JVM(Java, Kotlin)

[Java] 배열 최대 할당 가능 크기?

물론 시스템 마다 메모리 설정이 다를 테니 단정 지을 수 없다.

바이너리 검색 기법(?)을 이용해서 범위 내에서 왔다갔다 하니 현재 시스템에서 사용가능한 최대 크기를 구할 수 있었다.

(물론 이 수치는 시스템마다 혹은 JVM 구현체나 버전에 따라 바뀔 수 있는 사항이므로 주의!)

10483639

20483639 o

25000000 o

26250000 o

27000000 o

27250000 o

27450000 o

27475000 o

27480000 o

27482500 o

27483000 o

27483050 o

27483075 o

27483080 o

27483082 o

27483083 o

27483084 o

27483085 x

27483100 x

27483150 x

27483250 x

27483500 x

27484000 x

27485000 x

27500000 x

30000000 x

50483639 x


배열은 아래처럼 정수형으로 했다.

int count[] = new int[27483084];


추가 작성글,

자바에서 new로 할당된 객체는 Heap에 보관된다. 만약 힙의 크기를 초과하면 OutOfMemoryError 예외가 발생한다.

Exception in thread "main" java.lang.OutOfMemoryError: Java heap space

        at ArrayTest.main(ArrayTest.java:7)


자바에서 정수는 4바이트이므로 단위가 커서 char로 할당을 받아서 테스트를 해보았다.

JVM의 힙 크기는 -Xms -Xmx로 조정이 가능하다.

-Xms 기준으로

1024M : 3억 5천 바이트

2048M : 7억 1천 바이트

4096M : 14억 바이트

가 할당이 가능했다.


2GB정도라면 약 7억개의 char[]이 할당이 가능하다는 것이다.

ArrayTest.zip


하지만 Java에서 배열의 크기는 int 범위내에서 가능하다. 즉 Integer.MAX_VALUE (0x7fffffff)를 넘을 수 없다는 것이다.

이 사항은 Java에서 뿐만 아니라 OS의 제약이 있는 사항이다.

C언어에서도 아래의 코드를 빌드하려고 하면 에러가 발생한다.

int main(int argc, char* argv[])

{

char bigArray[0x80000000];

return 0;

}

에러

error C2148: 배열의 전체 크기는 0x7fffffff바이트를 초과할 수 없습니다.


배열에서 할당받을 수 없는 메모리라면 운영체제가 제공하는 MMF(Managing Memory-Mapped Files)를 고려해보는 게 어떨까 생각이 든다. 하지만 MMF라고 하더라도 2GB의 제한이 있는듯...