2010년 8월 10일 화요일

Eclipse Memory PermSize 오류 (Java1.6.20_b20)

이번 포스트는 배껴 쓴 것입니다.
원문은 http://hanavy.egloos.com/10545584 입니다.





새로운 패치버전이 아니라 공지라서 좀 이상해서 클릭해 보니 결국 Eclipse 라기보다는 어찌 보면
Sun(이젠 Oracle이지)의 문제로 인한 버그였다.

일단 영문 전문은 다음과 같다.


Oracle/Sun VM 1.6.0_21 on Windows

The Eclipse 3.3 - 3.6 launchers for Windows have a problem with the Oracle/Sun Java VM version '1.6.0_21'.

UPDATE: The latest JDK/JRE downloads have fixed this problem, so the simplest way to resolve is to download and re-install from http://www.java.com (alternative link is http://java.sun.com/javase/downloads/index.jsp)


Before the fix was released, there were three choices to work around this:

switch back to '1.6.0_20' (as of July 19, 2010 it can still be downloaded here)
Change the commandline for launching or add the following line after "-vmargs" to your Eclipse.ini file:
-XX:MaxPermSize=256m
(Detailed instructions/examples)
For Helios, download the fixed eclipse_1308.dll and place it into
(eclipse_home)/plugins/org.eclipse.equinox.launcher.win32.win32.x86_1.1.0.v20100503
The bug itself is open for voting and comments as 6969236 on the Java BugParade, and as bug 319514 on the Eclipse side.



요는 Sun 이 Oracle로 넘어가면서 새로 나오게 된 최신 VM인 1.6.0의 21번 패치에서 java/javaw 실행파일의
내부 문자열에서 VM 종류를 확인하기 위한 회사명(vendor flag)을 Sun에서 Oracle로 변경하면서 Eclipse가
새로운 vm을 제대로 인식하지 못한 것이었다.
그래서 확장 옵션인 메모리 Permsize를 추가하는 옵션을 제대로 주지 못하여 고질적인 메모리 부족 현상이
일어난 것이었다.

해결책은 위에 나온 것 처럼 3가지(4가지?)가 있다.
가장 좋은 방법은 일단 번호 나온 위에 업데이트 된 것처럼 자바의 새 패치 버전이 나온 듯 하다.
(하긴 Eclipse가 개발자들 사이에서 가장 많이 쓰이니 빨리 대응해야 했겠지...)

java -version 명령으로 확인할 경우 이전 자바는 다음과 같은 내용이 나타난다.


Java(TM) SE Runtime Environment (build 1.6.0_21-b06)
Java HotSpot(TM) Client VM (build 17.0-b16, mixed mode, sharing)


위의 굵은 글씨로 표시한 부분을 보면 알겠지만 b06 버전이다.
이 버전이 문제가 있으며 똑같이 패치번호는 21번으로 동일하지만 지금 새로 받으면 b07 버전이 된다.
위 공지의 첫번째 내용은 아직 그 전에 내용으로 20번 패치버전으로 받으라는 얘기였다.

두번째는 eclipse가 내부적으로 메모리 세팅을 하지 못하는 상황이므로 강제로 MaxPermSize를 vmargs로 추가해 주는 방법이다.

세번째는 이제부터 이클립스 버전 따라 다를텐데 일단 현재 최신인 Helios 기준으로 변경된 vm의 벤더 인식 알고리즘을 바꾼 dll을 바꿔끼우는 방법이다.
그 아래 줄줄히 옛날 버전의 대응방법도 나와있다.

이 상황을 겪으면서, 다시 한번 프로그램의 유지보수에 대한 내용을 또 고민해 볼 수 있는 기회가 되었다.
정확히 어떠한 문자열인지, 그게 일종의 내부 정보인지 아니면 공식으로 인정되는 부분인지는 확인할 수 없었지만
(앞이면 Eclipse Foundation에서 잘못한거고 뒤면 Oracle에서 잘못 한거겠지..)
의외로 별 거 아닌거 바꾼 걸로 파급효과가 크게 되었다.

실제 나는 별거 아니라고 바꿔서 배포했다가 그걸 참조했던 프로그램들 때문에 고생했던 기억이 몇 번 있는 나로서는
남 얘기(?)같지 않고 연민감도 드는 일이었다..(덕택에 며칠 삽질은 했다만...)

댓글 없음:

댓글 쓰기