공유할 서비스 선택

TECH


TECH

Middleware (OutOfMemory-2) OutOfMemoryError 원인과 대책 & "GC란?..튜닝방법 공개"..J…

페이지 정보

작성자 미들웨어 아이디로 검색 전체게시물 댓글 0건 조회 301회 좋아요 1회 작성일 20-08-03 20:51

본문

안녕하세요 "미들웨어" 입니다.

 

지난 1장에서는 "(OutOfMemory-1) OutOfMemnory 란? OOM & HeapDump 파일생성 및 분석 가이드 " 에 대해 정의해봤습니다. 

이번 2장에서는 "(OutOfMemory-2) OutOfMemoryError 원인과 대책" 대해서 진행해보겠습니다,

 

(OutOfMemory-1) OutOfMemnory 란? OOM & HeapDump 파일생성 및 분석 가이드 

(OutOfMemory-2) OutOfMemoryError 원인과 대책 & "GC란?..튜닝방법 공개"..Jstat, Jmater, Visual GC

(OutOfMemory-3) OutOfMemory 발생시 slack 알람으로 메세지 전송 스크립트

그럼 2장 시작하겠습니다.

 

1. Out Of Memory Error 유형 

• java.lang.OutOfMemoryError: Java heap space 

• java.lang.OutOfMemoryError: PermGen space 

• java.lang.OutOfMemoryError: requested bytes for . Out of swap space? 

• java.lang.OutOfMemoryError: unable to create new native thread or java.lang.OutOfMemoryError:  

 

아래 그림은 정상적인 상태의 Memory 현황입니다 

2040be6df49a6ffeac0be9f0accd9309_1596455521_1703.png
 

 

일반적인 메모리 장애발생

- JVM Shutdown으로 인한 서비스 장애 

- Tomcat의 Full GC가 발생하고, gclog를 생성하여 비정상 종료됨 

 

2. [예제-1]

1. java.lang.OutOfMemoryError: Java heap space 자바 heap memory가 일시적인 과도한 요구 또는 지속적인 메모리누수로 인해 더 이상 요청한 메모리를 할당할 수 없을 때 발생한다. 

특정 프로그램에서 한번에 많은 메모리를 할당하는 경우라면 

JAVA_OPTS=-Xms2048m -Xmx2048m 옵션으 로 heap size 를 늘려서 해결할 수 있으나, 

지속적 누수로 인한 경우라면 heap dump를 떠서 누수 포인트를 찾아야 한다. 

 

java.lang.OutOfMemoryError: Java heap space

at java.util.Arrays.copyOf(Arrays.java:2882)

at java.lang.AbstractStringBuilder.expandCapacity(AbstractStringBuilder.java:100)

 

2040be6df49a6ffeac0be9f0accd9309_1596455535_7231.png
 

3. [예제-2]

2040be6df49a6ffeac0be9f0accd9309_1596455588_6197.png
4. [예제-3]

Heapdump 분석하여 setMaxInactiveInterval 확인 

2040be6df49a6ffeac0be9f0accd9309_1596455625_603.png


5. java.lang.OutOfMemoryError: PermGen space PermGen space

 JVM 메모리는 young gen, old gen, permanent gen으로 나뉘며, permanent 영역에는 클래스, 메쏘드 객체가 저장된다. 

WAS의 경우 수 많은 클래스들을 적재하게 되므로 permanent 영역을 많이 쓰게 되는데, 

특히 어플리케이션 디플로이/리디플로이시에 OutOfMemoryError: PermGen space를 많이 겪 게 된다. 

 

이 때는 -XX:MaxPermSize 값을 올려준다. 

 -XX:MaxPermSize 기본값은 64m이므로 

 -XX:MaxPermSize=128m 또는 

 -XX:MaxPermSize=256m으로 설정한다 



6. java.lang.OutOfMemoryError: requested bytes for . Out of swap space?

 JVM은 자바 힙 외에도 자체 구동을 위해 native heap을 사용한다. 

 이 에러는 native heap이 부족할 때 발생한다.

 에러 메시지의 Out of swap space를 보고 단순히 swap을 늘리는 경우도 있는데, 메모리가 부족해 swap을 쓰게 될 경우 성능이 급격히 저하되므로 그 보다는 왜 swap이 필요하게 됐는지부터 찾아 원인을 제거하는 것이 좋다.   일단 JVM 힙 크기를 정할 때는 swap이 일어나지 않도록 가용한 물리적 메모리 안에서 정해야 한다. 

 이 때 조심할 점은 JVM 힙은 java 프로세스가 사용하는 메모리 중의 일부일 뿐이라는 점이다. 

2040be6df49a6ffeac0be9f0accd9309_1596455768_6746.png
 

만약 가용 메모리가 1G가 남아있는데 -Xmx1g로 설정한다면 OutOfMemoryError는 예약된 것이나 다름없다 

- java heap 크기를 줄인다. (-Xmx512m) 

- thread 수를 줄이거나 thread stack size를 줄인다. 

-Xss256k, -XXThreadStackSize=256k (Solaris) 

-JNI를 사용한다면 해당 모듈에 memory leak이 있는지 확인 

 


7. java.lang.OutOfMemoryError: unable to create new native thread 

이는 OS에서 어떤 이유로 쓰레드를 생성하는데 실패했을 때 발생한다. 

메모리가 부족해서일 수도 있고, OS에서 쓰레드 개수를 제한해서 일 수도 있다.

 top으로 확인했을 때 free 메모리가 많이 남아 있다면 OS에서 건 제한이 원인일 확률이 높다. 

 

- Linux 경우 

1) proc/sys/kernel/thread-max 

2) user/include/bits/local_lim.h 

 

- HP-UX 경우 

max_thread_proc (# of threads per process)

nkthread (total number of threads) 

ex) kmtune | grep max_thread_proc

 


8. 가비지 콜렉터(Garbage Collector)의 역할

- 메모리 할당

- 사용중인 메모리 인식 

- 사용하지 않는 메모리 인식 

2040be6df49a6ffeac0be9f0accd9309_1596455867_9883.png
 

9. GC란 무엇인가?

GC는 Garbage Collection의 약자로 Java 언어의 중요한 특징중의 하나이다. 

GC는 Java Application에서 사용하지 않는 메모리를 자동으로 수거하는 기능을 말한다

2040be6df49a6ffeac0be9f0accd9309_1596455905_2622.png
Java의 메모리 영역은 New/Young 영역,Old 영역과 Perm 영역 이렇게 3가지로 영역으로 구성된다. 

JVM은 New/Young 영역과, Old영역 이 두 영역에 대해서만 GC를 수행한다.

Perm영역은 Code가 모두 Load되고 나면 거의 일정한 수치를 유지하므로 GC가 일어날 필요가 없다.

 

 

10. GC 옵션 설명 

 Tomcat 경우 /bin catalina.sh 에 설정하면 된다

 2040be6df49a6ffeac0be9f0accd9309_1596455957_8818.png
2040be6df49a6ffeac0be9f0accd9309_1596455982_2394.png
실제 Young 와 Old 영역에서 메모리 튜닝을 할때 Size 조절은 아래를 참고해서 하면 된다.

 

[ New, Survivor 영역 메모리 설정 ]

JAVA_OPTS="$JAVA_OPTS -XX:ParallelGCThreads=32" 

JAVA_OPTS="$JAVA_OPTS -XX:NewSize=1536m"

JAVA_OPTS="$JAVA_OPTS -XX:MaxNewSize=1800m"  

JAVA_OPTS="$JAVA_OPTS -XX:SurvivorRatio=3" 

 

위 옵션으로 설정할 경우 Eden : 921MB, Survivor : 307mb, old : 512mb 지정된다

 

 

11. Tomcat 에 적용할 수 있는 옵션

 hrapdump 

JAVA_OPTS=“ -Xms2048m -Xmx2048m 

 -XX:MaxPermSize=258m 

 -XX:+HeapDumpOnOutOfMemoryError 

 -XX:HeapDumpPath=/log/heapdump/tsacSvr1/" 

 

 GC 

 -verbose:gc 

 -Xloggc:/svc/omp/was/tomcat/tsacSvr1/gclogs/"$SERVER_NAME"_gc.log 

 -XX:+PrintGCDetails 

 -XX:+PrintGCDateStamps" 

 

 gc log (-verbose:gc 적용) 

[Times: user=0.12 sys=0.00, real=0.01 secs] [GC [PSYoungGen: 654240K->3648K(674048K)] 1154389K- >506114K(2072192K), 0.0114300 secs]

 

 

12. GC 튜닝절차 

1. GC 모니터링 Jstat, HPjmeter로 GC 상태를 모니터링 한다. 

 

2. 모니터링 결과 분석 후 GC 튜닝 여부 결정 GC수행 시간이 0.5초 미만이면 튜닝할 필요가 없으나, 1~2초가 넘어 가면 튜닝을 해야한다. 메모리를 어디에서 많이 사용하고 있는지 분석이 필요하므로 튜닝 전 heapdump를 먼저 분석한다. 

 

3. GC 영역 튜닝 Eden 영역에서 객체가 처음 만들어지고, Survivor 영역을 오가다가, 끝까지 남아 있는 객체는 Old 영역으로 이동한다. 간혹 Eden 영역에서 만들어지다가 크기가 커져서 Old 영역으로 바로 넘어가는 객체도 있긴 하다. Old 영역의 GC는 New 영역의 GC에 비하여 상대적으로 시간이 오래 소요되기 때문에 Old 영역으로 이동하 는 객체의 수를 줄이면 Full GC가 발생하는 빈도를 많이 줄일 수 있다. 

 

4. GC 방식/메모리 크기 지정 필요한 영역만 늘린다고 튜닝이 되는 것은 아니므로 여러 가지 상황을 비교해보면서 분석하는 것이 좋다. 동일한 처리를 하는 인스턴스가 두 개 이상 만들어서 비교하면 편하다.

 

13. GC 튜닝 툴 소개 "Jstat"

2040be6df49a6ffeac0be9f0accd9309_1596456251_6935.png
 

14. GC 튜닝 툴 소개 "Jmeter"

HP Jmeter HPJMeter는 -verbosegc 옵션의 출력 결과 분석을 쉽게 해 준다 

2040be6df49a6ffeac0be9f0accd9309_1596456308_9934.png
 

 

15. GC 튜닝 툴 소개 "Visual GC"

Visual GC를 이용하면 각 GC영역을 자세히 볼 수 있다. (Visual VM설치 후 CG설치) 

2040be6df49a6ffeac0be9f0accd9309_1596456360_5618.png
 

이것 으로 OOM 발생원인 및 대응방법, GC란?,..GC 튜닝 방법, GC 분석 도구까지 한번에 가이드 진행했습니다.

그럼 도움이 되시길 바랍니다~!

 

이상 미들웨어 였습니다.

 

 

 

댓글목록

등록된 댓글이 없습니다.

TECH 목록
번호 제목 작성자 작성일 조회수
61 Middleware 미들웨어 아이디로 검색 전체게시물 10-16 29
(JBoss & Wildfly) JBoss-eap 에서 wildfly 마이그레이션시 발생 에러

카테고리 : Middleware

29 0
작성자 : 미들웨어 20/10/16
60 ETC Leesangwoo 아이디로 검색 전체게시물 10-14 37
Docker 설치 및 실행

카테고리 : ETC

37 0
작성자 : Leesangwoo 20/10/14
59 Middleware 미들웨어 아이디로 검색 전체게시물 10-03 63
(JBoss & Wildfly) 자격증 시험 문제 공개 (첫번째, 두번째 시험문제)

카테고리 : Middleware

63 0
작성자 : 미들웨어 20/10/03
58 Middleware 미들웨어 아이디로 검색 전체게시물 10-03 64
(JBoss & Wildfly) wildfly 란? 다운 & 설치방법 및 기본 구성 방법

카테고리 : Middleware

64 0
작성자 : 미들웨어 20/10/03
57 Middleware 미들웨어 아이디로 검색 전체게시물 09-19 98
(Monitoring) WAS 오픈소스 모니터링 소개 "Grafana & Prometues을 사용한 모니터링 방법"

카테고리 : Middleware

98 0
작성자 : 미들웨어 20/09/19
56 OS LeeHyongDong 아이디로 검색 전체게시물 09-15 109
[Linux] RedHat Insights 설명 및 설정

카테고리 : OS

109 0
작성자 : LeeHyongDong 20/09/15
55 Middleware 미들웨어 아이디로 검색 전체게시물 09-01 200
(Monitoring) WAS 오픈소스 모니터링 소개 "Scouter"

카테고리 : Middleware

200 0
작성자 : 미들웨어 20/09/01
54 OS LeeHyongDong 아이디로 검색 전체게시물 08-17 199
[Linux] CentOS 및 Oracle linux에서 RHEL로 전환방법

카테고리 : OS

199 0
작성자 : LeeHyongDong 20/08/17
53 Middleware 미들웨어 아이디로 검색 전체게시물 08-16 146
(OutOfMemory-3) OutOfMemory 발생시 slack 알람으로 메세지 전송 스크립트

카테고리 : Middleware

146 0
작성자 : 미들웨어 20/08/16
52 ETC Leesangwoo 아이디로 검색 전체게시물 08-12 390
Docker 소개

카테고리 : ETC

390 0
작성자 : Leesangwoo 20/08/12
Total 61건
게시물 검색

주식회사 클럭스| 대표 : 이찬호| 사업자등록번호 : 107-87-27655
주소 : 서울특별시 영등포구 국회대로 800, 여의도파라곤
E-mail : sales@chlux.co.kr
Copyright © 클럭스 www.chlux.co.kr All rights reserved.
상단으로Top