Garbage Collection 모니터링 방법

2022. 11. 18. 13:38카테고리 없음

JVM에서 어떻게 GC가 수행되고 있는지 실시간으로 알 수 있는 방법을 소개하려 합니다.

 

GC모니터링 전 ! 자바 실행 옵셥 주기(Option)

 

옵션 종류

메모리 공간

메모리 공간은 크게 힙영역과 힙영역이 아닌 공간으로 구분할 수 있습니다. 힙영역은 사용자가 크기를 정할 수 있는 공간입니다.

  • Method : 클래스, 변수, 함수, 정적 변수, 상수 정보 등이 저장되는 영역. 프로그램 전체에서 공유
  • Stack : 함수 내에서 사용되는 매개변수, 지역변수, 리턴값 등이 저장되는 구역.
  • PC Register: CPU의 Register와 역할이 비슷하고, 현재 수행중인 JVM 명령의 주소값이 저장
  • Native Method Stack: 네이티브 메소드 호출을 위해 할당되는 구역
  • Heap : new 명령어로 생성된 객체가 저장되는 영역. GC의 대상이 되는 영역

힙 영역 구조

힙영역은 가비지 콜렉션(GC)의 대상이 되는 영역입니다. Young, Old, Meta 영역으로 구성됩니다.

  • Young
    • new 로 생성되는 신규 객체의 영역.
    • Eden, S0, S1 로 구성.
    • 마이너 GC의 대상
  • Old
    • Young에서 살아 남은 객체를 저장하는 영역.
    • Full GC의 대상
  • Meta:
    • 클래스 객체의 정보가 보관되는 공간
    • JDK8부터 생성. JDK7 버전까지 Permenant Generation영역(PG)이었음.
    • PG영역의 메모리 누수 방지, GC 성능 개선을 위하여 메모리 구조를 변경
    • PG영역을 Metaspace와 Compressed Class Space영역으로 기능을 분할

힙 영역 메모리 설정

HotSpot JVM의 힙영역을 설정하는 옵션과 설정 방법은 다음과 같습니다.

$ java -Xms1024m -Xmx1024m -XX:NewSize=512m -XX:MaxNewSize=512m -XX:PermSize=512m -XX:MaxPermSize=512m

메모리 옵션

  

옵션 내용
Xms 힙 영역 시작 메모리 사이즈(start)
Xmx 힙 영역 최대 메모리 사이즈(max)
Xmn Eden 영역의 초기 메모리 사이즈
XX:PermSize Permanent Generation의 초기 사이즈
XX:MaxPermSize Permanent Generation의 최대 사이즈
XX:MetaspaceSize 메타 영역의 초기 사이즈
XX:MaxMetaspaceSize 메타 영역의 최대 사이즈
XX:NewSize New 영역의 사이즈
XX:MaxNewSize New 영역의 최대 사이즈
XX:SurvivorRatio New/Survivor영역 비율 (n으로 지정시 Eden : Survivor = 1:n)
XX:NewRatio Young Gen과 Old Gen의 비율 (n으로 지정시 Young : Old = 1:n)
XX:MaxTenuringThreshold 마이너 GC에서 Young 영역에서 Old 영역으로 이동하는 기준 횟수 설정값(15이하로 설정하는 것이 좋음)

 

GC 모니터링이란

GC 모니터링이란 JVM이 어떻게 GC를 수행하고 있는지 알아내는 과정을 말한다. 가령 Young 영역에 있던 객체를 Old 영역으로 언제 얼마나 이동했는지, stop-the-world가 언제 일어나고 얼마동안 일어났는지 등의 정보를 알 수 있다. GC를 모니터링하는 이유는 JVM이 효율적으로 GC를 수행하는지 파악하고 추가적인 GC 튜닝 작업이 필요한지 확인하기 위해서다. GC 모니터링으로 파악한 정보를 바탕으로 애플리케이션을 수정하거나 GC 방법을 변경(GC 튜닝)할 수 있다.

 

GC를 모니터링하는 방법은?

GC를 모니터링하는 방법에는 여러 가지 방법이 있지만, GC 수행 정보를 사용자에게 보여 주는 방법만 다르다. GC는 JVM이 수행하는 것이고 GC 모니터링 도구는 JVM이 제공하는 GC 정보를 받아 사용자에게 보여 주는 것이기 때문에, 어떤 방법을 사용하든 동일한 결과를 얻을 수 있다. 그렇기 때문에 여러 GC 모니터링 방법을 모두 익혀야 할 필요는 없지만 GC 모니터링 방법을 익히는 데에는 아주 약간의 시간만 투자하면 되므로, 여러 GC 모니터링 방법을 익혀 둔다면 환경과 상황에 따라 적합한 GC 모니터링 방식을 빠르게 쓸 수 있어 도움이 될 것이다.

이 글에서 설명하는 도구나 JVM 옵션은 JVM 벤더에 상관없이 공통적으로 사용할 수 있는 방법은 아니다. GC 수행 정보를 보여 주는 것에 대한 '표준'은 필요 없기 때문이다. 이 글에서는 HotSpot JVM(Oracle JVM)을 기준으로 설명할 것이다.

GC 모니터링 방법은 접근 인터페이스에 따라 CUI와 GUI로 구분할 수 있다.

대표적인 CUI GC 모니터링 방법에는 'jstat'이라는 CUI 애플리케이션을 이용하는 방법과 JVM을 가동할 때 '-verbosegc'라는 JVM 옵션을 이용하는 방법이 있다.

GUI GC 모니터링 방법은 별도의 GUI 애플리케이션을 이용한다. 대표적인 GUI 애플리케이션 세 가지를 꼽으라면 'jconsole', 'jvisualvm', 'Visual GC'를 들 수 있다.

(Java) VisualVM + Visual GC

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

JDK 포함 버전이 아니라 홈 페이지에서 Visual VM을 내려 받을 수도 있다. 편의상 이 둘을 구분하기 위해 JDK 포함 버전은 Java VisualVM(jvisualvm)이라고 부르고, 홈 페이지에서 내려 받는 버전을 Visual VM(visualvm)이라고 부른다. 둘의 기능이 완벽히 동일한 것은 아니고, 플러그인 설치 등에서 약간의 기능 차이가 있다. 필자는 개인적으로는 별도로 내려 받는 Visual VM을 선호하는 편이다.

Visual VM을 가동한 후 왼쪽의 패널에서 모니터링하려는 애플리케이션을 선택하면, 다음과 같은 Monitoring 탭을 찾을 수 있다. 이 Monitoring 탭에서 GC와 힙에 대한 개략적인 정보를 볼 수 있다.

Visual GC 설치 화면

 

 

Visual VM의 기본 기능만으로도 개략적인 GC 상황을 알 수는 있지만 jstat이나 -verbosegc 옵션만큼 자세한 정보는 알 수 없다. jstat 만큼의 자세한 정보를 원한다면 Visual GC 플러그인을 설치하는 것이 좋다. Visual GC는 Tools 메뉴에서 실시간으로 설치할 수 있다.

 

Visual GC를 이용하면 jstatd 실행을 통해 알 수 있는 정보를 좀 더 직관적으로 볼 수 있다.

 

 

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

https://ifuwanna.tistory.com/221