코딩마을방범대

우분투 톰캣 메모리릭 발생 시 본문

💡 백엔드/우분투

우분투 톰캣 메모리릭 발생 시

신짱구 5세 2023. 5. 29. 16:49
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가 증가되어있다

 

 

 


 

참고사이트

Tomcat Memory Leak 설정

[Linux] 리눅스 tomcat heap memory 확인 및 설정

 
728x90