-
[JAVA] Garbage Collection 모니터링CS/개발 언어 (JAVA) 2021. 6. 21. 23:36
GC 모니터링
- JVM이 어떻게 GC를 수행하고 있는지 알아내는 과정
- Young 영역에 있는 객체를 Old 영역에 언제 얼마나 이동했는지, stop-the-world가 언제 얼마나 일어났는지에 대한 정보를 알 수 있음
GC 모니터링 방법
jstat
VMID (Virtual Machine ID)
- 동작하고 있는 VM을 가리키는 ID
- jstat을 통해서 모니터링을 하기 위해서는 vmid 정보를 argument로 전달 필요
- VMID를 확인하기 위해서는 아래와 같이 jps 명령어를 통해서 확인 가능
$ jsp 2981 auth-api.jar
GC 관련 jstat 옵션
옵션 기능 gcutil 각 힙 영역에 대한 사용 정도를 백분율로 보여준다. 아울러 총 GC 수행 횟수와 누적 GC 시간을 알 수 있다. gc 각 힙(heap) 영역의 현재 크기와 현재 사용량(Eden 영역, Survivor 영역, Old 영역등), 총 GC 수행 횟수, 누적 GC 소요 시간을 보여준다. gccapacity 각 힙 영역의 최소 크기(ms), 최대 크기(mx), 현재 크기, 각 영역별 GC 수행 횟수를 알 수 있는 정보를 보여준다. 단, 현재 사용량과 구적 GC 소요 시간은 알 수 없다. jstat의 옵션에 따른 컬럼 정보
컬럼 설명 jstat 옵션 S0C Survivor 0 영역의 현재 크기를 KB 단위로 표시 -gc -gccapacity -gcnew -gcnewcapacity S1C Survivor 1 영역의 현재 크기를 KB 단위로 표시 -gc -gccapacity -gcnew -gcnewcapacity S0U Survivor 0 영역의 현재 사용량을 KB 단위로 표시 -gc -gcnew S1U Survivor 1 영역의 현재 사용량을 KB 단위로 표시 -gc -gcnew EC Eden 영역의 현재 크기를 KB 단위로 표시 -gc -gccapacity -gcnew -gcnewcapacity EU Eden 영역의 현재 사용량을KB 단위로 표시 -gc -gcnew OC Old 영역의 현재 크기를 KB 단위로 표시 -gc -gccapacity -gcold -gcoldcapacity OU Old 영역의 현재 사용량을KB 단위로 표시 -gc -gcold PC Permanent영역의 현재 크기를 KB 단위로 표시 -gc -gccapacity -gcold -gcoldcapacity -gcpermcapacity PU Permanent영역의 현재 사용량을KB 단위로 표시 -gc -gcold YGC Young Generation의 GC 이벤트 발생 횟수 -gc -gccapacity -gcnew -gcnewcapacity -gcold -gcoldcapacity -gcpermcapacity -gcutil -gccause YGCT Yong Generation의 GC 수행 누적 시간 -gc -gcnew -gcutil -gccause FGC Full GC 이벤트가 발생한 횟수 -gc -gccapacity -gcnew -gcnewcapacity -gcold -gcoldcapacity -gcpermcapacity -gcutil -gccause FGCT Full GC 수행 누적 시간 -gc -gcold -gcoldcapacity -gcpermcapacity -gcutil -gccause GCT 전체 GC 수행 누적 시간 -gc -gcold -gcoldcapacity -gcpermcapacity -gcutil -gccause S0 S1 E O P YGC YGCT FGC FGCT GCT 0.00 66.44 54.12 10.58 86.63 217 0.928 2 0.067 0.995 0.00 66.44 54.12 10.58 86.63 217 0.928 2 0.067 0.995 0.00 66.44 54.12 10.58 86.63 217 0.928 2 0.067 0.995
- 평균 Minor GC 소요시간
- YGCT(0.928) / YGC(217) = 0.004 (4ms)
- 평균 Full GC 소요시간
- FGCT(0.067) / FGC(2) = 0.033 (33ms)
-verbosegc 옵션
직관적으로 이해하기 쉬운 출력 결과를 GC가 발생할 때마다 보여주기 때문에 개략적인 GC 정보를 모니터링하기 좋음
$ java -Xms1024m -verbose:gc -XX:+PrintGCDetails -Xloggc:gc.log -jar auth-api.jar [1.968s][info][gc ] GC(1) Pause Young (Concurrent Start) (Metadata GC Threshold) 330M->22M(1024M) 24.450ms
- 330M : GC전 Heap 메모리 총 사용량
- 22M : GC후 Heap 메모리 총 사용량
- 1024M : 전체 Heap 메모리 크기 (Young Generation + Old Generation)
- 24.450ms : GC를 위해 Java 애플리케이션 수행을 멈춘 시간
VisualVM
- Oracle/JDK가 제공하는 프로파일링/모니터링 툴
- 아래 사이트에서 다운로드 받아서 설치
CPU, Memory, Classes, Threads의 상태를 확인 가능
Tools - Plugins - Available Plugins - Visual GC 설치 시 각 영역의 사용량과 수행 시간을 확인 가능
용어 설명
- Permanent Area
- JVM 메모리에서 Method Area를 Permanect Area라고 한다.
- Full GC
- Minor GC + Major GC
참조 사이트
https://mirinae312.github.io/develop/2018/06/04/jvm_memory.html
Java Memory 간단히 살펴보기 - J's log
Java 애플리케이션을 실행하는 경우, JVM 메모리에는 여러가지 데이터가 로드되고 해제된다. JVM 의 메모리는 어떤객체를 저장하고 어떤 용도로 사용되는지에 따라 여러 영역으로 나뉘어져 있다. J
mirinae312.github.io
https://d2.naver.com/helloworld/6043-XX:+PrintGCTimeStamps
'CS > 개발 언어 (JAVA)' 카테고리의 다른 글
[JAVA] GC 튜닝 (0) 2021.06.26 [개발언어] @Controller vs @RestController (0) 2021.06.04 [JAVA] Reactive Streams (0) 2021.05.16 [JAVA] 자바 가상 머신 (Java Virtual Machine) (0) 2021.05.12 [JAVA] JVM Memory (0) 2021.04.22