본문 바로가기

Programming/JAVA/JSP

OutOfMemory 해결 방법?

JVM 셋팅 값을 조절해서 해결하는 방법이 있다는데...

아직 해보지는 못했다. 나중에 참고하려고 포스팅함.

출처 : http://www.javaservice.net/~java/bbs/read.cgi?m=appserver&b=engine&c=r_p&n=1149127021&p=8&s=t

제목 : Tomcat 메모리가 줄지 않아요. 증가만 하다가 오바가 납니다.
글쓴이: 임장빈(guguly) 2006/02/27 20:06:51 조회수:3078 줄수:51
안녕하세요. 
웹하면서 java.lang.OutOfMemoryError
격은적은 여러번있는데 이런적은 처음이라서 이렇게 질문을 드립니다.

** 메모리 OutOfMemoryError가 날정도가 아니라 메모리가 줄지 않아서 입니다.
** 아래 소스는 참고로 메모리가 올라갈 정도로 테스트 해주시기 부탁합니다.
** 100000 ~ 555555 정도로 세팅하면 메모리가 잘 올라갑니다.
** 999999 값은 바로 OutOfMemoryError 납니다.

컴퓨터 환경 
팬티엄 4 3.0 메모리 1기가
톰켓 5.0 에서 
---------- TOMCAT 5.0.28 START --------------------------------------
List list = new ArrayList();
for (int i=0; i < 999999; i++ ) {
	Map map = new java.util.HashMap();
	map.put(String.valueOf(i),String.valueOf(i));
	list.add(map);
}
---------- TOMCAT 5.0.28 END --------------------------------------
이 소스를 돌리면 아웃 오브 메미리 가 납니다.
그런데 이걸 태스트 한 이유는 실제 데이터 베이스 접속하고 나서 화면에 보여주고 ..
(STRUTS 1.1 or 1.2환경 둘다 같은 현상 )
1.엑션 
2. 디비에서 데이터를 가져옮 (데용량? 만건 ) MS-SQL (엠에스에서 공개한 버젼 JDBC)
3. 해당 데이터 가공 ( 2번 디비 에서 가져올때와 가공할때 메모리를 많이 사용함)
4. 엑셀(POI를 이용) 해당 데이터를 엑셀로 만들어 다운로드 시킴 (POI 2.0)

그런데 이 프로그램에서 메모리 오바가 납니다. 이러 저러 소스를 지우고 처음부터 하는 마음으로
다시 짜고 했지만 결과는 같습니다.
원인은 메모리가 줄지 않고 늘어나기만 하다고 
(디폴트로 60메가가 세팅 되어 있더라구요. (메모리를 늘리는게 중요한것이 아니라 메모리가 줄어들어야 할듯(프로그램 끝난뒤엔) 합니다)
그래서 톰켓 버젼 5.X 다 다른것으로 해보고 4.28 4.31 등으로 대여섯번 바꾸어서 태스트 해보아도
역시 줄지 않답니다.

참고로 위 소스는 톰켓 5.x에서는 777777 정도에서 메모리가 풀나서 에러나고
4.x에서는 100000 정도에서 풀납니다.

원인을 모르겠어요.
지금 jdk를 바꾸어서 테스트 준비중입니다. 설마 jdk 에 문제가 있다고는 생각하지 않습니다.
환경 문제는 그렇습니다.

왜 그러는지 원인을 모르겠습니다.
메모리 누수는 아닌듯 합니다.
프로그램 수행중에 스태틱이나 그런것은 유틸 밖에 쓰지 않았고 태스트 하는중에 관련 
메로리 반환 안할만 한것은 다 지우고 태스트도 해보았습니다.
결과적으로 저 jsp 를 만들고 태스트 해본결과 메모리가 전혀 줄지 않고 있습니다.
 
그럼 부탁 드리겠습니다.

제목 : Re: poi에서 엑셀 저장시....
글쓴이: 수빈아빠(tripsketch) 2006/03/02 09:52:57 조회수:1947 줄수:9
메모리 문제라면 일단...

포이를 이용하셨다고하니.. 포이에서 엑셀에 저장해서 담아다운받는 레코드한정된 수가있습니다.

정확히 기억이 안납니다만.. 5천정도라인? 포이관련된내용을 찾아보시면될듯하구요.

다운받는 부분이 따로 구현된거라면 다운받는 로직도 검토를 해보셔야할듯합니다.

http://prettyboa.cafe24.com
제목 : Re: 당연히 오류나야 하는 것 아닌가요??
글쓴이: 손님(guest) 2006/03/15 15:59:44 조회수:2014 줄수:14
 저야 초보라서 걍 제 생각을 적겠습니다...^^;

일단. for문을 도는 동안 계속해서 동적 메모리를 할당 받는 구조이니...프로그램이

끝날동안 메모리야 줄어들 이유가 없을것 같구요.....

운영체제에서 한 프로세스당 할 당하는 메모리 양이 있을텐데..그걸 초과 했기 때문이 아닐까요??

저라면 for문에 print를 찍어보고 그 숫자 이상으로는 동적메모리를 생성하지 않도록

프로그램을 새로 짜것습니다...^^;

제목 : Re: java option조정
글쓴이: 김동우(twopairs) 2006/06/01 10:57:01 조회수:2499 줄수:21
저도 이런 문제로 고통을 겪은 적이 있는데요...

제가 해결한 패턴은 다음과 같습니다.

outofmemory는 생성되는 객체를 위해 더 이상 할당해줄 메모리 공간이 없다는 의미인데...
java에서 memory를 할당해주는 놈은 tomcat을 실행시킨 jvm이죠.

그러면 jvm에 보다 많은 메모리를 제공하면 문제가 해결된다고 생각했었습니다.

jvm의 메모리 관리에 개발자가 영향을 미칠 수 있는 가장 쉬운 방법은 java가 실행될 때 Xms Xmx등의 메모리 관련 옵션을 사용하는 것입니다.

<다음은 sun jvm의 경우입니다.>
아마.. 아무런 옵션을 주지 않으면 디폴트로 가용한 메모리 크기가 128M인가로 설정이 되는데요..
그래서 예를 들면 tomcat의 catalina.sh에 다음과 같은 값으로 option을 조정하였습니다.
JAVA_OPTS="-Xms512m -Xmx512m -XX:PermSize=64m -XX:MaxPermSize=64m -XX:NewSize=400m -XX:MaxNewSize=400m -XX:SurvivorRatio=4 -XX:+PrintGCDetails -XX:+PrintGCTimeStamps -XX:+PrintHeapAtGC"

Xms, Xmx, permsize, newsize survivorRatio등의 옵션을 적절히 사용하면 아마 outofmemory 문제를 해결할 수 있을 것입니다. 위의 숫자설정에 대한 가이드는 javaservice.net이나 웹에서 outofmemeory로 검색해보시면 좋은 아티클이 많습니다. 

그리고 위의 예제 코드가 무사히 실행을 마치고 실행스택에서 빠진 후에 GC가 발생하면 메모리가 줄어들 것 같네요.