SharedIT | 묻고 답하기(AMP)

JAVA GC 모니터링 문의

안녕하세요.

전산실 인프라 운영을 맡고 있으나 모르는게 많습니다ㅜㅜ

특정 시스템(Jeus 6+Webtob)에서 "java.lang.OutOfMemoryError: GC overhead limit exceeded" 오류가 일주일에 한번 정도 발생하고 있습니다.

4월 전에는 거의 발생하지 않았습니다.

아래는 JSTAT -gcutil 1000 명령어로 해당 오류가 생기기 시작한 시간부터의 로그입니다.

  S0      S1      E      O       P      YGC    YGCT  FGC    FGCT    GCT

46.61   0.00  96.33  50.74  99.52    290    2.464   190   35.184   37.649

  0.00  39.69  16.64  58.11  99.52    291    2.645   190   35.184   37.829

  0.00  39.69  41.61  58.11  99.52    291    2.645   190   35.184   37.829

  0.00  39.69  68.23  58.11  99.52    291    2.645   190   35.184   37.829

  0.00  39.69  94.86  58.11  99.52    291    2.645   190   35.184   37.829

 51.02   0.00  16.13  64.31  99.52    292    2.810   190   35.184   37.994

 51.02   0.00  41.22  64.31  99.52    292    2.810   190   35.184   37.994

 51.02   0.00  64.52  64.31  99.52    292    2.810   190   35.184   37.994

 51.02   0.00  87.82  64.31  99.52    292    2.810   190   35.184   37.994

  0.00  55.79   5.83  71.95  99.52    293    3.047   190   35.184   38.231

  0.00  55.79  30.11  71.95  99.52    293    3.047   190   35.184   38.231

  0.00  55.79  52.52  71.95  99.52    293    3.047   190   35.184   38.231

  0.00  55.79  76.80  71.95  99.52    293    3.047   190   35.184   38.231

  5.16  55.79 100.00  74.23  99.52    294    3.047   190   35.184   38.231

 55.33   0.00  19.20  80.25  99.52    294    3.318   190   35.184   38.502

 55.33   0.00  42.24  80.25  99.52    294    3.318   190   35.184   38.502

 55.33   0.00  59.62  80.25  99.52    294    3.318   190   35.184   38.502

 55.33   0.00  82.66  80.25  99.52    294    3.318   190   35.184   38.502

 55.33  55.88 100.00  84.32  99.52    295    3.318   190   35.184   38.502

  0.00  55.88   0.00  88.53  99.52    295    3.534   191   35.184   38.719

  0.00  55.88   0.00  88.53  99.52    295    3.534   191   35.184   38.719

  0.00  55.88   0.00  88.53  99.52    295    3.534   191   35.184   38.719

  0.00  55.88   0.00  88.53  99.52    295    3.534   191   35.184   38.719

  0.00   0.00  13.70  96.85  99.52    295    3.534   191   39.606   43.140

  0.00   0.00  39.01  96.85  99.52    295    3.534   191   39.606   43.140

  0.00   0.00  60.43  96.85  99.52    295    3.534   191   39.606   43.140

  0.00   0.00  83.79  96.85  99.52    295    3.534   191   39.606   43.140

  0.00   0.00 100.00  96.85  99.52    295    3.534   192   39.606   43.140

  0.00   0.00 100.00  96.85  99.52    295    3.534   192   39.606   43.140

  0.00   0.00 100.00  96.85  99.52    295    3.534   192   39.606   43.140

  0.00   0.00 100.00  96.85  99.52    295    3.534   192   39.606   43.140

  0.00   0.00 100.00  96.85  99.52    295    3.534   192   39.606   43.140

  0.00   0.00 100.00  96.85  99.43    295    3.534   192   39.606   43.140

  0.00   0.00  23.15 100.00  99.51    295    3.534   192   45.720   49.254

Java 덤프(hprof) 파일을 MemoryAnalyzer로 보니 아래와 같습니다.


관련 내용을 찾아보다보니 "-verbose:gc"로 GC 로그를 수집가능하다고해서, 찾아보니 스크립트들이 다 리눅스서버용 로그더라구요.

지금 사용중인 서버는 윈2012 이고 JEUS 6를 사용중입니다.

아래 스크립트는 현재 내부의 다른 리눅스 서버에 들어있는 코드입니다.

-verbose:gc 

-XX:+DisableExplicitGC 

-XX:+PrintGCDetails 

-XX:+PrintGCTimeStamps 

-XX:+PrintGCDateStamps 

-XX:+PrintHeapAtGC 

-Xloggc:/app/logs/jeus/gclog/xxx.log


이 코드를 이용해서 오류나는 서버의 JEUSMain.xml 파일에 넣어보려고 하는데요.


<command-option>-Xms4096m -Xmx4096m -XX:MaxPermSize=2048m -XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=D:\TmaxSoft\dump\</command-option>


이 부분에 아래 코드를 넣으면 될까요? (마지막 줄을 어떻게 적어야될지 모르겠어요)

-verbose:gc 

-XX:+DisableExplicitGC 

-XX:+PrintGCDetails 

-XX:+PrintGCTimeStamps 

-XX:+PrintGCDateStamps 

-XX:+PrintHeapAtGC 

-Xloggc:D:\TmaxSoft\GC\gc.log


아니면 인터넷에서 찾아본 아래 코드를 넣는게 나을까요?

-Xloggc:D:\TmaxSoft\GC\gc_$(date '+%Y%m%d%H%M%S').log 

-verbose:gc 

-XX:+PrintGC 

-XX:+PrintGCDateStamps 

-XX:+PrintGCTimeStamps 

-XX:+UseGCLogFileRotation 

-XX:NumberOfGCLogFiles=15

-XX:GCLogFileSize=10m

Tags : 태그가 없습니다.

5개의 답변이 있습니다.

hgp33
  0 추천 | 9일 전

오호 GC도 로그를 받을 수 있군요?? 처음 알았네요. 

명동쓰레빠
  0 추천 | 10일 전

내용 잘 보았습니다.

앵그리파파
  0 추천 | 14일 전

내용을 보면서 궁금한 사항이 생겼습니다. 유지보수 계약이 체결되어 있지 않는지 궁금합니다.

보통 이런경우 운영자는 본인이 잘 알지 못하면 검색을 통해 자료를 찾아보는 등 활동도 좋지만, 조금 더 전문적인 제조사 또는 유지보수 업체에 문의하기 마련입니다. 

개인적으로 공부하는 영역도 아니고 회사의 자산이고 대외적으로 서비스를 하고 있는 것이라면 매출과 연계되고 기업 및 기관의 신뢰도에도 영향을 미칠 수 있을 것입니다. 

오류가 지속되고 있다면 빠른 해결이 우선되어야 할 텐데 첫째도, 둘째도 우선 잘 모르시면 유지보수 업체에 문의하세요. 기술지원을 받으시는게 좋습니다. 

혹시, 유지보수 계약이 체결되지 않아서 여기서 문의를 하셨다면 글쎄요, 대답기다리고 원하는 답이 나올때까지 시간이 만만치 않을 텐데 마냥 기다리시겠어요?

특정 시스템(Jeus 6+Webtob)에서 발생하는 "java.lang.OutOfMemoryError: GC overhead limit exceeded" 오류는 자바 애플리케이션이 너무 많은 시간을 가비지 컬렉션에 사용하여 실제 작업에 대해 쓸모없이 많은 시간을 소비하는 경우 발생합니다.

이 문제를 해결하기 위해서는 힙 크기를 늘리는 것이 도움이 됩니다. 이를 통해 가비지 컬렉션의 빈도를 줄이고, 애플리케이션에서 더 많은 작업을 수행할 수 있습니다.

그리고 가비지 컬렉션 알고리즘 및 매개변수를 조정하여 성능을 향상시킬 수도 있습니다. 

예를 들어, Collector Most 또는 Garbage-First 등의 다른 가비지 컬렉션 알고리즘을 사용하거나, 가비지 컬렉션의 시작 및 종료 시간을 조정할 수 있습니다.

또한, 코드를 최적화하여 불필요한 객체 생성을 줄이고, 메모리를 더 효율적으로 사용하면 도움이 됩니다.

마지막으로 시스템이 충분한 메모리 및 CPU 리소스를 가지고 있는지도 체크해 보세요. 때로는 시스템 자원 부족으로 인해 가비지 컬렉션이 비효율적으로 동작할 수 있습니다. 


krlove0 | 14일 전

다른 시스템은 제우스 유지보수를 하는데, 문제가 생긴 시스템은 유지보수에 포함이 안되어 있더라구요.

일단 시스템 성능 로그도 취합해서 같이 봤는데, 하드웨어 리소스 문제는 아니었어요.


조언 주신 다른 부분들 참고해서 처리해보겠습니다.

감사합니다.

wansoo
  0 추천 | 15일 전

-Xloggc:D:\TmaxSoft\GC\gc_$(date '+%Y%m%d%H%M%S').log 


를 윈도용으로 제대로 표현하려면...


-Xloggc:D:\TmaxSoft\GC\gc_%date:~0,4%%date:~5,2%%date:~8,2%%time:~,2%%time:~3,2%%time:~6,2%.log


와 같이 처리해야 제대로 표현할 수 있을  것 같네요.


Unix/Linux에서 $(date '+%Y%m%d%H%M%s')는 년(4자리)월(2자리)일(2자리)시간(24시간2자리)분(2자리)초(2자리) 를 표시해주는 변수에 해당하고요.


윈도우에서 이와 동일하게 년월일시간분초를 붙여서 파일명에 출력하고 싶을 경우라면 유닉스/리눅스보다 복잡한 형식으로 %date:~0,4%%date:~5,2%%date:~8,2%%time:~,2%%time:~3,2%%time:~6,2% 와 같이 표현해야 $(date '+%Y%m%d%H%M%s')와 동일한 결과를 얻을 수 있겠네요.

krlove0 | 14일 전

감사합니다~

topkslee
  0 추천 | 15일 전

인터넷에서 검색한게 좋은것 같습니다.

기본적으로 똑같지만 log 파일 사이즈를 10m마다 구분하고 최대 15개로

나누어 떨어뜨리게 구성했고, log로 gc 날짜로 구분되어 있어 관리하시긴 더 좋을겁니다.


krlove0 | 15일 전

조언 감사합니다.

그럼 저 붉은색 글로 된 경로 부분은 저렇게 쓰면 되는걸까요?

topkslee | 15일 전

네. 경로 이름은 빨간색처럼 하시면 됩니다.

다만, date는 linux 명령어입니다. 

windows 서버에서는

-Xloggc:D:\TmaxSoft\GC\gc_%t.log

krlove0 | 15일 전

감사합니다^^