주요글: 도커 시작하기
반응형

본 글의 저작권은 이동훈(블로그 운영자가 아님)님에게 있으며 저작권자의 허락없이 온라인/오프라인으로 본 글을 유포/복사하는 것을 금합니다.


문자열 길이와 관련된 요소들에 대해서 살펴본다.

String 클래스의 문자열 저장 방식

String 클래스는 내부적으로 문자열을 저장하기 위하여 char 형의 배열을 사용한다. 이때 char 형은 자바의 문자 인코딩 방식이 유니코드이므로 1바이트가 아니라 2바이트의 크기를 가진다. 따라서 10글자의 문자를 저장한다면 20바이트의 메모리 공간이 필요하다.

  String str = "안녕하세요.";
  System.out.println(str.length());

위의 코드는 모두 6글자 (마침표 포함) 이므로 str 객체는 길이 6의 char 배열을 할당받아서 문자열을 저장하므로 str.length() 문장의 결과로 6이라는 값이 출력된다. 그러나 실제로 사용된 메모리의 양은 12 byte 이다.

String 객체의 메모리 상의 위치

String 객체가 메모리 상에서 위치하는 곳은 어디일까. 모든 생성된 객체는 힙 메모리에 위치하게 된다. 힙 메모리는 프로세스가 실행될 때 운영체계로부터 할당 받게 된다. 자바 프로그램의 경우는 자바가상머신(JVM) 프로세스 상에서 실행되므로, 자바가상머신이 실행될 때 운영체계로부터 힙 메모리를 할당 받는다. 프로세스 실행 도중에 힙 메모리가 부족하면 자바가상머신이 운영체계로부터 추가로 할당 받게 된다.

스트링 객체 내부의 char 형 배열도 역시 힙 메모리 상에 위치하게 된다. 따라서 문자열의 크기에 대한 한계는 힙 메모리의 크기와 관련된다.

자바 실행 환경의 힙 메모리 설정

자바 실행 환경(JRE)은 자바 프로세스의 실행 시에 할당 가능한 힙 메모리의 크기를 지정할 수 있도록 되어 있다. 힙 메모리의 크기에 관한 설정은 두가지 항목이 있다. 하나는 초기 힙 메모리의 크기이며, 또 하나는 힙 메모리의 최대 크기이다.

초기 힙 메모리의 크기는 프로세스 실행 시작 시에 처음부터 할당 받아서 사용하는 힙 메모리 공간의 크기이며, 최대 힙 메모리의 크기는 힙 메모리가 부족할 때 늘릴 수 있는 최대 크기이다.

자바 규약에서는 자바 가상 머신 구현에 따라 힙 메모리의 크기가 고정되어 있을 수도 있고, 가변적일 수도 있다라고 되어 있다. 가변적일 경우 초기 힙 메모리와 최대 힙 메모리의 양을 설정할 수도 있다.

선 마이크로시스템즈의 자바 실행 환경(JRE)에서 초기 힙 메모리와 최대 힙 메모리의 크기를 지정하는 옵션은 다음과 같다.

  java -Xms16m -Xmx128m MyClass

위의 문장은 MyClass 라는 자바 프로그램을 초기 힙 메모리 16MB로 실행하며, 최대 힙 메모리는 128MB까지 허용한다는 뜻이다. 만약 힙 메모리 크기를 지정하는 옵션을 생략할 경우 초기 힙 메모리는 보통 1 내지 2MB 이며, 최대 힙 메모리는 64MB이다.

선 마이크로시스템즈의 자바 가상 머신의 초기 힙 메모리의 크기는 64MB가 한계이며 최대 힙 메모리의 크기는 운영체계에 달려 있다.

보통 32비트 머신(대부분의 유닉스 머신들, 윈도우 또는 리눅스 등이 설치된 펜티엄 계열의 머신들)의 경우에는 일반적으로 2GB가 최대 힙 메모리의 크기이다. 이것은 32비트 머신들의 특징이며, 운영체계에 따라 더 작을 수도 있다.

String 클래스의 문자열 길이의 한계

결국, String 클래스의 문자열 길이의 한계는 힙 메모리의 크기에 따라 결정되며, 자바 가상 머신의 최대 힙 메모리의 크기를 넘을 수 없다.

즉, String 클래스의 문자열의 최대 가능 길이는 대체로 32비트 머신의 경우 2GB가 한계이며, 운영체계에 따라 대개 이보다 작다. 또한, 프로세스의 최대 힙 메모리 할당량 옵션에 따라 그 한계는 더 작아질 수 있다.

결론

String 클래스의 문자열 길이의 한계는 하드웨어 머신과 운영체계에서 허용하는 최대한의 크기까지 가능하며, 특별히 규약에서 제약하는 사항은 없다. 단, 자바 가상 머신에 따라 힙 메모리 할당에 옵션 설정이 있을 수 있다.

관련링크:

본 글의 저작권은 이동훈에 있으며 저작권자의 허락없이 온라인/오프라인으로 본 글을 유포/복사하는 것을 금합니다.


+ Recent posts