물론 시스템 마다 메모리 설정이 다를 테니 단정 지을 수 없다.
바이너리 검색 기법(?)을 이용해서 범위 내에서 왔다갔다 하니 현재 시스템에서 사용가능한 최대 크기를 구할 수 있었다.
(물론 이 수치는 시스템마다 혹은 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[]이 할당이 가능하다는 것이다.
하지만 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의 제한이 있는듯...
'Programing > JVM(Java, Kotlin)' 카테고리의 다른 글
[후벼파는 자바] GC(가비지 컬렉션) (0) | 2015.01.13 |
---|---|
Gradle Project 사용해보기 (0) | 2015.01.12 |
[MVC] 파일 업로드 (0) | 2015.01.05 |
String, StringBuffer, StringBuilder의 차이점과 장단점? (0) | 2014.11.20 |
STS 이클립스에 설치하기 (0) | 2014.10.27 |