ksj9411   3년 전

간단하게 각 자리수를 분리해 배열에 담고

더했는데 메모리 초과가 발생하는 이유가 뭔가요?

rlarla97   3년 전

문제를 보면 자연수는 1 ≤ N ≤ 1,000,000 의 범위 내로 주어집니다.

작성자님 코드를 보면 매 반복문마다 String[] 배열을 사용하고 계신데, 1,000,000 의 가까운 수가 입력되면 반복문 num = 0 부터 해당 입력값이 나올 때 까지 반복을 하게 됩니다.
이 과정에서 String[] 배열을 매번 생성하고 있는데, String[] 배열은 참조배열(주소를 담아두고 있음)이죠?

즉, N사이즈 String[] 배열에 대하여 직접 값을 담고 있는 것이 아니기 때문에 배열 한 인덱스 당 주소와 기타 정보(객체헤더, 길이 필드 등..)를 담고있는 32비트에서는 (N * 4 + 20), 64비트에서는 (N * 8 + 20) 의 메모리가 할당됩니다.

거기에 String의 경우 내부적으로는 char[] 로 담고있죠. char은 2바이트죠? 때문에 결과적으로 N = 1,000,000이라고 한다면, 32비트 기준 1,000,000 * 4 + 20 + 2 * 1,000,000 (최소치)입니다.

즉, 대략 6MB 가량 사용하는데, 이 용량이 결코 작은 것이 아닙니다. JVM에서 가비지 컬렉터가 메모리 해제를 한다 한들, GC는 필요할 때만 가비지를 수집하기 때문에 실제로는 반복문 내에서 가비지컬렉터가 수집 안할 가능성이 높다는 뜻(매 반복문마다 gc처리 비용은 매우 비쌈)이고, 이는 메모리를 그만큼 누적해서 쓰고있다는 뜻이 됩니다.

해결 방법은 수학적 지식을 이용하여 푸시거나 String 풀을 최소하하는 방법을 추천드립니다.

ksj9411   3년 전

rlarla97

감사합니다. 메모리 계산을 하는데 조금 착각하고 계산했더니 기본적인 크기 계산도 못 했네요.

댓글을 작성하려면 로그인해야 합니다.