ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • Garbage Collection 모니터링
    JAVA공부/JVM 2022. 1. 12. 01:30

    GC모니터링

    JVM이 어떻게 GC를 수행하는지를 알아내는 과정을 말하는데, Young영역에서 Old영역으로 얼마나 이동했는지,

    Stop-The-World가 언제 일어나고 얼마동안 일어났는지 정보를 알 수 있다.

    또한, 때에 따라서 GC튜닝이 필요한지 안한지 확인하기 위해서다.

     

    모니터링방법


      1.jstat

                 HotSpot JVM에 있는 모니터링 도구이다.  그외 HotSpot JVM 모니터링 도구로는 jps나 jstatd가 있다.

                 jstat은 GC수행정보 뿐 아니라 클래스로더 수행정보나 Just In Time 컴파일러 수행정보도 알 수 있다.

                 jstat은 $JAVA_HOME/bin 디렉토리에 있다. 

                환경변수로 설정한 $JAVA_HOME 을 불러오는 방법 (운영체제, 프롬프트에 따라 명령어가 다르다 -_-)

                

      window [cmd.exe] : echo %JAVA_HOME% 

      window [gitbash] : echo $JAVA_HOME

      window [powershell] : Get-ChildItem Env:JAVA_HOME OR echo $env:JAVA_HOME

      

     프로세스 ID 구하는 방법 $JAVA_HOME/bin 디렉토리에서 jps.exe 실행 << 이방법은 WAS가 여러개 실행되고있을때는

     부트스트랩 정보만 나타내기 때문에 ps -ef|grep java 명령어를 함께 사용한다.

    jstat -gc <vmid> 1000 10' 이라고 하면 1초마다 한번씩 총 10회 GC모니터링 정보를 출력한다.

    GC와 관련된 옵션을 소개하면 다음과 같다.

     

    옵션 기능
    gc 각 힙영역의 현재 크기와 현재사용량, 총 GC수행 횟수, 
    누적 GC 소요시간을 보여준다.
    gccapacity 각 힙 영역의 최소크기(ms), 최대 크기(mx), 현재크기,
    각 영역별 GC수행 횟수를 알 수 있는 정보를 보여준다.
    단 현재 사용량과 누적GC소요시간은 알 수 없다.
    gccause -gcutil옵션이 제공하는 정보와 함께 마지막 GC원인과
    현재 발생하고 있는 GC의 원인을 알 수 있는 정보를 보여준다.
    gcnew New 영역에 대한 GC 수행 정보를 보여준다
    gcnewcapacity New 영역의 크기에 대한 통계 정보를 보여준다.
    gcold Old 영역에 대한 GC 수행정보를 보여준다.
    gcoldcapacity Old 영역의 크기에 대한 통계정보를 보여준다.
    gcpermcapcity Permanent 영역에 대한 통계정보를 보여준다
    gcutil 각 힙영역에 대한 사용정도를 백분율로 보여준다 .
    아울러 총 GC수행 횟수와 누적 GC시간을 알 수 있다.

     

      jstat 명령어 수행 jstat -gcutil -h20 -t processId 2000 3000

      gcutil : gcutil에 대해서 수행

      h20 : 20라인마다 header 찍음

      -t : time stamp 찍음 (JVM이 스타트 된 이후의 시간)

      2000 : interval(ms단위) 2초

      3000 : count (회)

    칼럼 설명
    S0  Survivor 영역 0의 사용률(현재의 용량에 대한 퍼센티지)
    S1  Survivor 영역 1의 사용률(현재의 용량에 대한 퍼센티지)
    E  Eden 영역의 사용률(현재의 용량에 대한 퍼센티지)
    O Old 영역의 사용률(현재의 용량에 대한 퍼센티지)
    P Parameter 영역의 사용률(현재의 용량에 대한 퍼센티지)
    YGC  Young 세대의 GC 이벤트 수
    YGCT  YOUNG 세대의 가베지 콜렉션 시간
    FGC 풀 GC 이벤트 수
    GCT  가베지 콜렉션 총 시간

     

    2.-verbosegc 옵션

    -verbosegc 옵션은 Java애플리케이션을 가동할때 지정하는 JVM옵션 가운데 하나이다. jstat은 특별한 옵션을 지정하지

    않은 어떤 Java애플리케이션도 모니터링할 수 있으나, -verbosegc옵션은 시작할 때 지정해야 하기 때문에 굳이 사용할

    필요가 없는 옵션으로 이해할 수도 있다. 그러나 직관적으로 이해하기 쉬운 출력결과를 GC가 발생할 때마다 보여주기

    때문에 개략적인 GC정보를 모니터링 할때 아주 좋다.

     

    jstat VS -verbosegc 옵션

      jstat -verbosegc
    모니터링 대상 터미널에 로그인 할 수 있는 머신에서
    가동중인 JAVA애플리케이션이거나
    jstatd를 통하여 네트워크로 연결할 수 있는 리모트 JAVA애플리케이션
    JVM 시작 옵션으로 -verbosegc를
    지정한 JAVA애플리케이션에 대해서만
    출력 정보 힙상태(사용량,최대크기,GC횟수/시간등) New 영역과 Old 영역에 대한 GC 이전/
    이후 크기와 수행시간
    출력 시기 지정한 시간 간격마다 GC 발생시
    유용할 때 힙 영역의 크기 변화를 관찰 할때 한번의 GC에 대한 효과

    -verbosegc 의 부가 옵션들
      1. -XX:+PrintGCDetails

      2. -XX:+PrintGCTimeStamps

      3. -XX:+PrintHeapAtGC

      4. -XX:+PrintGCDateStamps 

       

    만약 -verbosegc옵션만 사용한다면 -XX:+PrintGCDetails옵션이 기본 적용된다.

    -verbosegc옵션을 사용하면 Minor GC발생시 다음과 같은 형식의 결과를 볼 수 있다.

    [GC [<collector>: <starting occupancy1=""> -> <ending occupancy1="">, <pause time1=""> secs] <starting occupancy3=""> -> <ending occupancy3="">, <pause time3=""> secs] </pause></ending></starting></pause></ending></starting></collector>

     

    Collector : MinorGC를 위해 사용하는 컬렉터이름

    starting occupancy1 : GC전 Young 영역의 크기

    ending occupancy1 : GC 후 Young 영역의 크기

    pause time1 : Minor GC를 위해 Java 애플리케이션이 수행을 멈춘 시간

    starting occupancy3 : GC전 전체 힙 크기

    ending occupancy3 : GC 후 전체 힙 크기

    pause time3 : Major GC를 포함하여 전체 힙 GC를 위해 Java애플리케이션 수행을 멈춘 시간

     

    Minor GC의 출력 결과

    [GC [DefNew: 4032K->64K(4032K), 0.0429742 secs] 9350K->7748K(32704K), 0.0431096 secs] [GC [DefNew: 4032K->64K(4032K), 0.0403446 secs] 11716K->10121K(32704K), 0.0404867 secs]

     

    Full GC 출력 결과

    [Full GC [Tenured: 3485K->4095K(4096K), 0.1745373 secs] 61244K->7418K(63104K), [Perm : 10756K->10756K(12288K)], 0.1762129 secs] [Times: user=0.19 sys=0.00, real=0.19 secs]

     

    CMS Collector를 사용하면 다음과 같은 CMS정보도 얻을 수 있다  

    [CMS-concurrent-mark: 0.129/0.129 secs] [CMS-concurrent-preclean: 0.007/0.007 secs] … [CMS-concurrent-sweep: 1.208/1.208 secs] [CMS-concurrent-reset: 0.036/0.036 secs]

     

    CMS Collector 란?

    Concurrent Mark Sweep Collector 인데, -XX:+UseConcMarkSweepGC 옵션으로 사용할 수 있으며,

    대부분의 가비지 컬렉션 작업을 애플리케이션 스레드와 동시에 수행함으로써 가비지 컬렉션으로 인한

    Stop The World 시간을 최소화 하는 GC이다.

     

    -verbosegc 옵션은 GC이벤트가 발생할 때마다 로그를 출력하기 때문에, GC수행으로 인한 힙 사용률 변화를 알기 쉽다.

     

     

     

     

    GUI 방식의 GC프로파일링 / 모니터링 툴

    VisualVM + Visual GC

    Java VisualVM은 Oralcle JDK가 제공하는 GUI 프로파일링 / 모니터링 툴이다.

    https://visualvm.github.io/ 다운로드 링크

    JDK에 포함된 버전이 아닌 경우 홈페이지에서 Visual VM을 내려받을 수 있다.

    JDK 포함 버젼은 Java Visual VM(jvisualvm)이라 하고, 홈페이지에서 받는 버전을 Visual VM(visualvm)이라고 부른다.

    기능은 비슷하나 플러그인 설치등 기능 차이가 약간 있다.

     

     

     

    Visual VM에서 해당 JVM을 클릭 후  Monitor를 노르면 현재 GC와 힙의 개략적인 상황을 알 수 있다.

    (필자는 Eclipse를 사용중이다.)

    jstat만큼 자세한 정보를 원한다면

     

     

    상단 탭의 Tools - Plugins를 선택해서 AvailablePlugins를 선택하여 Install해주면 된다. (필자는 이미 설치했다.)

     

    Visual GC를 킨 모습이다. Heap 영역에 대한 정보를 자세히 알 수 있고, GC Time에 대한 정보도 있어 유용하다.

     

    HPJMeter

    HPJMeter는 -verbosegc옵션의 출력 결과 분석을 쉽게 해주는 툴이다. 

    아직 -verbosegc를 사용해 보지 않아 사용 후기는 다음에 남기려고 한다.

     

     

     

     

     

    많은글들을 읽어보았지만 jstat로 간략한 모니터링을 하고 이상증상 발생시에는 -verbosegc옵션으로 GC를 분석한다고

    한다. 실질적인 문제들은 배포버전에서 생기므로 리눅스 환경에서 사용하는 방법을 좀 더 공부해봐야겠다.

     

     

     

     

     

    출처 JVM GC 모니터링 (tistory.com)

     

    JVM GC 모니터링

    JVM에 Garbage Collector 의 모니터링에 대해 알아보자 jstat jstat은 HotSpot JVM에 있는 모니터링 도구이다. jstat 이외에 HotSpot JVM 모니터링 도구로는 jps와 jstatd가 있다. Java 애플리케이션을 모니터링할..

    neocan.tistory.com

    Garbage Collection 모니터링 방법 (naver.com)

     

    'JAVA공부 > JVM' 카테고리의 다른 글

    자바 Heap Dump  (0) 2022.11.04
    GC 튜닝  (0) 2022.01.14
    GC(Garbage Collection) 컬렉션 과 Heap 영역  (0) 2022.01.06
    JVM 기초 원리  (0) 2021.12.31
    JDK, JRE  (0) 2021.12.30
Designed by Tistory.