코딩마을방범대
우분투 톰캣 메모리릭 발생 시 본문
728x90
tomcat 서버 구동 시 메모리릭 발생
1. 현재 tomcat pid값 확인
$ sudo ps -aux | grep tomcat
tomcat 6052 6.2 10.0 7987608 1625540 ? Sl 15:07 3:46 //bin/java -Djava.util.logging.config.file=/data/tomcat/conf/logging.properties -Djava.util.logging.manager=org.apache.juli.ClassLoaderLogManager -Xmx2048m -Xms2048m -XX:PermSize=1024m -XX:MaxPermSize=1024m -XX:NewSize=512m -XX:MaxNewSize=1024m -XX:ParallelGCThreads=2 -XX:-HeapDumpOnOutOfMemoryError -Djdk.tls.ephemeralDHKeySize=2048 -Djava.protocol.handler.pkgs=org.apache.catalina.webresources -Dignore.endorsed.dirs= -classpath /data/tomcat/bin/bootstrap.jar:/data/tomcat/bin/tomcat-juli.jar -Dcatalina.base=/data/tomcat -Dcatalina.home=/data/tomcat -Djava.io.tmpdir=/data/tomcat/temp org.apache.catalina.startup.Bootstrap start
2. heap memory 확인
$ sudo jmap -heap 6052
Attaching to process ID 6052, please wait...
Debugger attached successfully.
Server compiler detected.
JVM version is 25.121-b13
using thread-local object allocation.
Parallel GC with 2 thread(s)
Heap Configuration:
MinHeapFreeRatio = 0
MaxHeapFreeRatio = 100
MaxHeapSize = 2147483648 (2048.0MB)
NewSize = 1073741824 (1024.0MB)
MaxNewSize = 1073741824 (1024.0MB)
OldSize = 1073741824 (1024.0MB)
NewRatio = 2
SurvivorRatio = 8
MetaspaceSize = 21807104 (20.796875MB)
CompressedClassSpaceSize = 1073741824 (1024.0MB)
MaxMetaspaceSize = 17592186044415 MB
G1HeapRegionSize = 0 (0.0MB)
Heap Usage:
PS Young Generation
Eden Space:
capacity = 786956288 (750.5MB)
used = 776871656 (740.8825454711914MB)
free = 10084632 (9.617454528808594MB)
98.71852704479566% used
From Space:
capacity = 141033472 (134.5MB)
used = 54555656 (52.02832794189453MB)
free = 86477816 (82.47167205810547MB)
38.682771704010804% used
To Space:
capacity = 133693440 (127.5MB)
used = 0 (0.0MB)
free = 133693440 (127.5MB)
0.0% used
PS Old Generation
capacity = 1073741824 (1024.0MB)
used = 100825064 (96.1542739868164MB)
free = 972916760 (927.8457260131836MB)
9.39006581902504% used
45272 interned Strings occupying 5029192 bytes.
위 코드 실행 시 결과가 아래와 같이 오류가 발생하는 경우
Heap Usage:
Exception in thread "main" java.lang.reflect.InvocationTargetException
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:498)
at sun.tools.jmap.JMap.runTool(JMap.java:201)
at sun.tools.jmap.JMap.main(JMap.java:130)
Caused by: java.lang.RuntimeException: unknown CollectedHeap type : class sun.jvm.hotspot.gc_interface.CollectedHeap
at sun.jvm.hotspot.tools.HeapSummary.run(HeapSummary.java:144)
at sun.jvm.hotspot.tools.Tool.startInternal(Tool.java:260)
at sun.jvm.hotspot.tools.Tool.start(Tool.java:223)
at sun.jvm.hotspot.tools.Tool.execute(Tool.java:118)
at sun.jvm.hotspot.tools.HeapSummary.main(HeapSummary.java:49)
... 6 more
아래와 같이 디버그기능을 포함한 jdk 설치
$ sudo apt install openjdk-8-dbg
3-1. heap 메모리 사이즈 변경
Catalina.sh 위치로 이동
$ cd /usr/share/tomcat9/bin
Catalina.sh 파일안에, 맨 윗줄에 JAVA_OPTS이 존재합니다.
해당 옵션안에 -Xmx메모리사이즈m -Xms메모리사이즈m 옵션을 통해 변경이 가능합니다.
-Xmx메모리사이즈m : MAX메모리사이즈
-Xms메모리사이즈m : MIN메모리사이즈
JAVA_OPTS="-Xmx2048m -Xms2048m -XX:PermSize=1024m -XX:MaxPermSize=1024m -XX:NewSize=512m -XX:MaxNewSize=1024m -XX:ParallelGCThreads=2 -XX:-HeapDumpOnOutOfMemoryError "
3-2. setenv.sh 파일 생성
/usr/share/tomcat9/bin
위 위치에 setenv.sh 파일 생성 후 아래 내용 넣기
export CATALINA_OPTS="$CATALINA_OPTS -Xms256m"
export CATALINA_OPTS="$CATALINA_OPTS -Xmx4096m"
저장 후
$ sudo chown 계정명:계정명 ./setenv.sh
4. 톰캣 리스타트
다시 힙메모리를 확인해보면 MaxHeapSize가 증가되어있다
참고사이트
728x90
'💡 백엔드 > 우분투' 카테고리의 다른 글
리눅스의 파일 권한에 대한 정의 및 설정 방법 (0) | 2023.06.07 |
---|---|
JAVA_HOME, CATALINA_HOME 등 환경변수 설정 방법 (0) | 2023.06.07 |
우분투에서 MySQL 외부 접속 허용 설정하기 (0) | 2023.05.28 |
우분투에서 Tomcat 사용하기 - (3) log 확인 방법, war 배포 시 발생할 수 있는 오류들 (0) | 2023.05.28 |
우분투에서 Tomcat 사용하기 - (2) war파일 배포 (0) | 2023.05.27 |