자바에서는
Garbage Collector
라는 것이 존재합니다.
gc
를 통해 자동으로 불필요한 메모리를 해제해줌으로써 편하게 코드를 작성할 수 있습니다.만약
gc
의 내용을 자세하게 알고 싶다면 아래와 같은 과정을 거치면 됩니다.
이 과정은 자바가 설치되어 있다면 굳이 할 필요는 없습니다.
(자신이 받은java
의 bin의 위치를 path 환경변수에 등록해주시면 됩니다.)
저는 아래와 같이 스프링 프로젝트를 만든 후 실행시켰습니다.
10초마다 해당 객체를 생성해서 리스트에 넣는 로직입니다.
jstat -gcutil -t 8080 1000 0
jstat
은Java
의JVM
통계 모니터링 도구입니다. 이 도구는Java
프로세스의 성능 데이터를 수집하는데 사용됩니다.명령어
jstat -gcutil -t 8080 1000 0
를 이해하기 위해서는, 각각의 컴포넌트가 무엇을 의미하는지 알아야 합니다.
- jstat:
Java Virtual Machine(JVM)
의 통계 정보를 보여주는 명령어- gcutil: 가비지 컬렉션 통계를 보여주는 옵션. 각 가비지 컬렉션 통계의 사용량을 백분율로 표시합니다.
- t: 출력에 타임스탬프를 포함하는 옵션.
- 8844: 이 숫자는 모니터링 대상이 되는
Java
프로세스의PID(process ID)
입니다. 이 숫자는 예시이며, 실제 사용하려면 원하는Java
프로세스의PID
로 변경해야 합니다.- 1000: 데이터를 수집하는 간격을 밀리초 단위로 설정. 여기서는 1초마다 데이터를 수집하도록 설정되어 있습니다.
- 0: 몇 번 수집할 것인지를 지정. 0은 무한히 수집하라는 의미입니다.
위의 명령어를 사용하면 아래와 같은 결과가 나오게 됩니다.
PID의 경우 작업 관리자의 세부사항을 통해 확인 하실 수 있습니다.
현재
Eden
을 보시면 값이 계속 증가하는 것을 보실 수 있습니다.
현재 제 프로젝트는 객체를 생성한 후에 리스트에 넣어주고 있는 상황이므로 위와 같은 결과가 나온 것입니다. 그 외에는 변화가 없는데 객체 생성이 너무 적다 보니major gc
,minor gc
가 아직 동작을 하지 않은 것으로 보입니다.위
jstat
을 통해 파악할 수도 있지만 다른 모니터링 툴을 통해서도 이를 확인할 수 있습니다.
java 버전이 업되면서 다양한 gc 알고리즘이 추가되었습니다. 아래는 그 예이며 사용방법은 괄호 안 명령어를 사용하시면 됩니다.(gc튜닝전에 먼저 코드 부분에서 리팩토링 과정을 거치고 나서 최후의 수단으로 사용하시는 것을 추천드립니다.)
Serial GC (-XX:+UseSerialGC)
: 이 GC는 클라이언트 스타일의 애플리케이션에 적합하며, 특히 힙 크기가 작고 코어 수가 적은 시스템에서 잘 작동합니다. 그러나major gc
의 경우 시스템이 멈추는 상황이 발생할 수 있습니다.
Parallel GC (-XX:+UseParallelGC and -XX:+UseParallelOldGC)
: Parallel GC는 throughput 중심의 애플리케이션에 적합합니다. 이 GC는 멀티 코어 하드웨어에서 잘 작동하며, GC 중에는 애플리케이션 스레드가 일시 중단됩니다. 전자의 경우 young 부분에서만 멀티스레드로 동작한다면 후자는 old부분까지 포함해서 작동합니다.
Concurrent Mark Sweep (CMS) GC (-XX:+UseConcMarkSweepGC)
: CMS는 짧은 GC 중지 시간이 필요한 애플리케이션에 적합합니다. CMS는 애플리케이션의 실행을 최소한으로 방해하면서 메모리를 회수합니다.
G1 GC (-XX:+UseG1GC)
: G1 GC는 큰 힙 크기를 가진 시스템에 적합하며, GC 중지 시간을 짧게 유지하려고 합니다.
🥳티스토리 Inpa 이 분 블로그에 정말 좋은 자료가 많으니 한번 가보시면 좋을 것 같습니다.