본문 바로가기
반응형

할당한 메모리가 부족해서 뜨는 현상

 

1. 서버 기동시 발생한 경우

 

여기서 Xms, Xmx 값을 늘려주거나 PermSize, MetaspaceSize 등 메모리 분석해서 값을 조절해주면 됨.

또는 JDK 버전을 업그레이도 방안일 수 있으나, 현실적으로 JDK 업그레이드가 쉽지않음.

 

2. 배치 이후 발생한 경우

 

주로 

1) Memory Leak 현상 : 특정 object 가 메모리 사용 후 GC가 발생하여도 메모리가 반환되지 않고 점유하고 있어 계속해서 사용메모리가 증가하다가 최종적으로  OOM 발생

2) 대량의 데이터 점유로 인해 더이상 Heap 메모리 할당이 불가능하여 OOM 발생

 

필요 분석자료

1) Heapdump

2) GC 로그

3) ThreadDump 와 WebLogic(WAS) 로그

 

분석 방법

> 분석기를 이용하여 HeapDump 파일 분석 (IBM Heap Analyzer, Memory Analyzer(Eclipse) 등..)

   > 대량의 메모리를 점유하고 있는 Collection Object, Live Object 를 찾아낸다.

 

그 이후 GC Log 상태 확인, ThreadDump 에서 점유 스레드와 Heapdump 에서 메모리 과점유 객체의 연결성을 찾아본다.

 

30.485: [GC (Allocation Failure) [PSYoungGen: 245574K->35749K(279552K)] 390824K->181008K(978944K), 0.0287542 secs] [Times: user=0.10 sys=0.00, real=0.02 secs]
55.332: [GC (Allocation Failure) [PSYoungGen: 247717K->32587K(280576K)] 392976K->179058K(979968K), 0.0194387 secs] [Times: user=0.05 sys=0.00, real=0.02 secs]
57.009: [GC (Allocation Failure) [PSYoungGen: 244229K->67789K(256512K)] 390700K->295165K(955904K), 0.0352588 secs] [Times: user=0.12 sys=0.00, real=0.03 secs]
57.066: [GC (Allocation Failure) [PSYoungGen: 255786K->80045K(268800K)] 483162K->482528K(968192K), 0.0485665 secs] [Times: user=0.11 sys=0.06, real=0.05 secs]
57.137: [GC (Allocation Failure) [PSYoungGen: 268428K->80100K(217600K)] 670911K->669962K(916992K), 0.0502808 secs] [Times: user=0.11 sys=0.07, real=0.05 secs]
57.187: [Full GC (Ergonomics) [PSYoungGen: 80100K->0K(217600K)] [ParOldGen: 589861K->596983K(699392K)] 669962K->596983K(916992K), [Metaspace: 160938K->160937K(1193984K)], 0.3665741 secs] [Times: user=0.95 sys=0.01, real=0.37 secs]
57.571: [Full GC (Ergonomics) [PSYoungGen: 137022K->33792K(217600K)] [ParOldGen: 596983K->699323K(699392K)] 734006K->733115K(916992K), [Metaspace: 160942K->160942K(1193984K)], 0.4509592 secs] [Times: user=1.33 sys=0.05, real=0.45 secs]
58.036: [Full GC (Ergonomics) [PSYoungGen: 136268K->135177K(217600K)] [ParOldGen: 699323K->699319K(699392K)] 835592K->834497K(916992K), [Metaspace: 160944K->160944K(1193984K)], 0.2032003 secs] [Times: user=0.46 sys=0.00, real=0.20 secs]
58.239: [Full GC (Ergonomics) [PSYoungGen: 136624K->136202K(217600K)] [ParOldGen: 699319K->699319K(699392K)] 835943K->835521K(916992K), [Metaspace: 160944K->160944K(1193984K)], 0.1818154 secs] [Times: user=0.38 sys=0.00, real=0.19 secs]
58.421: [Full GC (Allocation Failure) [PSYoungGen: 136202K->119818K(217600K)] [ParOldGen: 699319K->698369K(699392K)] 835521K->818187K(916992K), [Metaspace: 160944K->160081K(1193984K)], 0.3909162 secs] [Times: user=1.05 sys=0.01, real=0.39 secs]
58.819: [Full GC (Ergonomics) [PSYoungGen: 137216K->133143K(217600K)] [ParOldGen: 698369K->699389K(699392K)] 835585K->832533K(916992K), [Metaspace: 160085K->160085K(1193984K)], 0.3623401 secs] [Times: user=1.00 sys=0.00, real=0.37 secs]
59.182: [Full GC (Ergonomics) [PSYoungGen: 137026K->135190K(217600K)] [ParOldGen: 699389K->699385K(699392K)] 836415K->834575K(916992K), [Metaspace: 160085K->160085K(1193984K)], 0.2040015 secs] [Times: user=0.48 sys=0.00, real=0.20 secs]
59.387: [Full GC (Ergonomics) [PSYoungGen: 136935K->136214K(217600K)] [ParOldGen: 699385K->699385K(699392K)] 836320K->835599K(916992K), [Metaspace: 160085K->160085K(1193984K)], 0.1769877 secs] [Times: user=0.37 sys=0.00, real=0.18 secs]
59.564: [Full GC (Allocation Failure) [PSYoungGen: 136214K->136209K(217600K)] [ParOldGen: 699385K->699385K(699392K)] 835599K->835594K(916992K), [Metaspace: 160085K->160085K(1193984K)], 0.1742729 secs] [Times: user=0.36 sys=0.00, real=0.17 secs]

Full GC 가 계속 발생하는 GC 로그. 문제가 있는 로그

 

GC Log 분석방법은 다른 포스팅 참조

https://wsnake0.tistory.com/entry/Java-GC-Log-AnalyzerIBM-GA-%EB%B6%84%EC%84%9D%ED%95%98%EA%B8%B0#

 

[Java] GC Log Analyzer(IBM GA) 분석하기

Analysis Tool for Java Garbage Collector 켜서 GC Log 읽혀주면 처음 뜨는 창은 다음과 같음 (개인 테스트 정보가 있어 가렸습니다) 이 GC Log 에서 나름 지켜볼만한 항목은 - Number Of Object Requests larger than 10 M by

wsnake0.tistory.com

 

https://wsnake0.tistory.com/entry/Java-GC-Log-%EC%97%90-%EA%B4%80%ED%95%98%EC%97%AC

 

[Java] GC Log 에 관하여

GC (Garbage Collecor) 을 보려면 Log 분석은 필수다. Garbage Collector (GC) 에대해 (참고) - JVM이 자체적으로 더 이상 사용하지 않는 메모리를 자동 해제해 줌 - 일반적으로 참조계수 확인을 통해 해제 > 참조

wsnake0.tistory.com

 

 

쓰레드덤프 뜨는법은 아래 참조

https://wsnake0.tistory.com/entry/WebLogic-HeapDump-Thread-Dump-%EB%9C%A8%EB%8A%94-%EB%B0%A9%EB%B2%95

 

[WebLogic] HeapDump, Thread Dump 뜨는 방법

Heapdump 뜨는법 1. USER_MEM_ARGS에 입력 (또는 JAVA_OPTS 으로 자바옵션을 WLS 기동 스크립트에 삽입) "-XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=[경로]" "-XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=/u01/sy/MiddleWare/wls12

wsnake0.tistory.com

 

 

분석 결과로는 배포이후 정상적으로 잘 사용하다가 OOM 이 발생한 경우 대개 WAS 문제는 크게없고 Appliaction 문제가 많았음. 하지만 어떤 이유로 발생했는지는 찾아보는게 개발자가 아닌 관리자 입장에서도 좋을듯.

 

 

대응방법으로는

-XX:OnOutOfMemoryError=<Argument> 이라는 옵션이 있는데,

이 옵션은 OOM 발생 시 Argument 를 실행한다.

 

예를들어 -XX:OnOutOfMemoryError= "kill -9 %p" 를 입력하면, OOME 발생시 프로세서를 kill 시킨다.

 

 

 

728x90
반응형

한걸음 한걸음

개인적인 기록