728x90
반응형

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가 발생하면 메모리가 줄어들 것 같네요.



◈ 톰캣 힙 메모리 조정하기 (윈도우용)
1. ( 톰캣 실행 파일 catalina.bat 수정 ) catalina.bat 파일 내에 해당 내용을 입력한다.
set JAVA_OPTS=-server -Xms128m -Xmx128m

시작 > 실행 > cmd (도스창들어간후) > catalina.bat stop 실행
시작 > 실행 > cmd (도스창들어간후) > catalina.bat start 실행
2. 서비스 시작 / 종료 파일생성
tomcat_start.bat ( 서비스 시작 )
C:
cd C:\Program Files\Apache Group\Tomcat 4.1\bin\
catalina.bat start
tomcat_stop.bat ( 서비스 종료 )
C:
cd C:\Program Files\Apache Group\Tomcat 4.1\bin\
catalina.bat stop
◈ 톰캣 힙메모리 조정하기 (리눅스용)

vi ./startup.sh   ( 톰캣 실행 파일 startup.sh 수정 )

#!/bin/sh
# -----------------------------------------------------------------------------
# Start Script for the CATALINA Server
#
# $Id: startup.sh,v 1.2 2002/01/15 02:55:38 patrickl Exp $
# -----------------------------------------------------------------------------

# resolve links - $0 may be a softlink
PRG="$0"

while [ -h "$PRG" ] ; do
  ls=`ls -ld "$PRG"`
  link=`expr "$ls" : '.*-> \(.*\)$'`
  if expr "$link" : '.*/.*' > /dev/null; then
    PRG="$link"
  else
    PRG=`dirname "$PRG"`/"$link"
  fi
done

PRGDIR=`dirname "$PRG"`
##############512m로 강제 셋팅 : START
export CATALINA_OPTS="-Djava.awt.headless=true -Xms512m -Xmx512m"
##############512m로 강제 셋팅 : END
EXECUTABLE=catalina.sh

########  ms, mx 값은 CPU의 갯수와 MEM크기에 따라 적절히 조정합니다. (EX:-Xms512m -Xmx512m )

# Check that target executable exists
if [ ! -x "$PRGDIR"/"$EXECUTABLE" ]; then
  echo "Cannot find $PRGDIR/$EXECUTABLE"
  echo "This file is needed to run this program"
  exit 1
fi

exec "$PRGDIR"/"$EXECUTABLE" start "$@"

728x90
반응형
블로그 이미지

nineDeveloper

안녕하세요 현직 개발자 입니다 ~ 빠르게 변화하는 세상에 뒤쳐지지 않도록 우리모두 열심히 공부합시다 ~! 개발공부는 넘나 재미있는 것~!

,