본문 바로가기
반응형

 

 

 

GC (Garbage Collecor) 을 보려면 Log 분석은 필수다.

 

Garbage Collector (GC) 에대해 (참고)
    - JVM이 자체적으로 더 이상 사용하지 않는 메모리를 자동 해제해 줌
    - 일반적으로 참조계수 확인을 통해 해제
        > 참조계수를 확인하고, 객체를 해제하는 과정에서 GC는 Heap영역에 대한 Lock이 발생하며,

           이로 인해 JVM이 멈추는 현상이 발생하게 됨    
    - GC가 수행하는 역할은 규칙적이고 일정하게 발생하는 것은 아님
        (어플리케이션의 패턴과 메모리의 크기에 따라 수행빈도와 처리시간이 다르다)

 

>> GC Log 에 Java Heap 메모리의 사용패턴과 GC의 수행패턴을 확인할 수 있는 정보가 기록됨

 

 

그럼 언제 GC Log 분석이 필요할까? 

주로 OOM이 발생하는 경우 (Out Of Memory Error)
- OOM이 발생하는 경우는 Heap메모리가 부족한 경우
메모리 leak으로 인한 OOM / 순간적으로 과도한 메모리 할당으로 발생하는 OOM 등...

 


GC Log가 제공하는 정보는 다음과 같다.


1. 메모리 사용패턴 (MeMory leak of Memory 사용량 급증)
2. GC 수행 횟수
3. GC 수행 시간

으로 추론이 가능한 Heap 메모리 사용률, GC 수행 패턴에 대한 정보가 있겠다.

 

 

GC Time/HeapSize 추이 그래프


Heap Size가 증가하게 되면 평균 Scanvenge GC에 대한 시간도 같이 증가하고, GC횟수는 감소한다.
Heap 메모리 사용에 문제가 없는 시스템이라면 HeapSize에 따라 GC Time, GC횟수는 달라진다.
HeapSize에 대한 GC Count*GC 시간이 가장 효율적인 부분이 적정 HeapSize.



그렇다면 GC Log 와 같이 GC를 확인할수 있는 옵션은 무엇이 있을까?

 

++ ) JVM 거는 GC 옵션

GC 를 확인할 수 있는 방법이 두 종류가 있는데, 한 개는 jstat 을 이용한 방법과 verbosegc 를 이용하는 방법이 있다.
이 중 jstat을 이용한 방법은 특별한 옵션을 지정하지 않은 어떤 Java 애플리케이션으로도 모니터링할 수 있다.
그러나 -verbosegc 옵션으로 확인하는 경우는 반드시 JVM에 -verbosegc 를 입력하여 옵션을 걸어주어야 한다. 
대신 verbosegc 가 직관적으로 이해하기 쉬운 출력결과를 남기므로 모니터링하기에 더 편한다.

 

자바 옵션
(리눅스) -verbosegc , -XX:+PrintGCDetail, -XX:+PrintGCTimeStamps -Xloggc:gc.log
(HeapDump 남기기 : -XX:+HeadDumpOnOutOfMemoryError -XX:HeadDumpPath=jvm.hprof )

[SUN] 
-verbosegc : 기본 GC Log 출력 옵션 -> default로 stdout에 log 기록됨 PrintGCDetilas, PrintGCTimeStamps 옵션을 조합하는 것이 일반적
-XX:PrintGCDetail : GC에 대한 추가적인 상세 정보를 출력하기 위한 옵션
-XX:PrintGCTimeStamps : GC가 수행한 내용에 timestamp 추가

[HP]
-Xverbosegc : HP JVM에서 GC Log 출력
-Xverbosegc:file=[파일경로] 를 통해 GC Log 파일 저장 위치 지정 가능

[IBM]
-verbosegc : GC 로그 출력 옵션
-Xverbosegclog:[파일경로] 를 통해 GC Log 파일 저장 위치 지정 가능

 


GC Log Template

[GC (Allocation Failure) [PSYoungGen: 524800K->79073K(611840K)] 524800K->79161K(2010112K), 0.0870770 secs] [Times: user=0.24 sys=0.03, real=0.09 secs]


Allocation = 할당
Allocation Failure = 새로운 메모리 할당 실패 -> 그래서 GC 수행
YoungGen : Young 영역에서 GC 수행함 (minor gc)

[GC (종류) ] [Young영역: 수행전크기->정리후 (Young영역전체크기) ] [GC전 전체 Heap -> GC후 전체 Heap (Heap전체크기), 걸린시간] […]

 

 

실제 GC 로그를 확인하게 되면 많은 라인수의 로그가 찍혀있어 확인이 어렵다.

익숙해진다면 로그만으로도 대략적인 추이를 봐서 분석이 가능하지만.. 분석기를 활용할 수 있다면 분석기를 활용하는것이 좋다.




그럼 로그분석은 어떻게?


https://gceasy.io/

 

gceasy.io

How to enable Java GC Logging? For Java 1.4, 5, 6, 7, 8 pass this JVM argument to your application: -XX:+PrintGCDetails -XX:+PrintGCDateStamps -Xloggc: For Java 9, pass the JVM argument: -Xlog:gc*:file= file-path: is the location where GC log file will be

gceasy.io

 

또는 gc log 분석툴인 IBM Java Garbage Collector 등을 활용하

728x90
반응형

한걸음 한걸음

개인적인 기록