Search

GC를 이해하기 위해 알아야 되는 OS 지식

GC의 역할

OS로 부터 메모리 영역을 확보
애플리케이션에서는 객체 생성 등 메모리가 필요할때 GC가 확보한 메모리 영역을 사용함

GC의 주요 테크닉

세대별 청소(generational scaveging)와 aging 기법을 사용해서 JVM Heap내에서도 회수할 만한 객체가 많이 있을 법한 영역에 집중.
살아있는 개체들은 한 곳에 모아서 최대한 연속된 free영역을 확보하려고 노력한다.
GC가 동작할 때 여러 스레드를 사용해 최대한 병렬로 동작할 수 있도록 하고, 오래 걸리는 GC작업은 백그라운드 애플리케이션 코드와 동시에 실행 될 수 있도록한다.

언제 GC 선택과 튜닝이 중요한가?

기술은 상황에 맞게 알맞게 설정해야된다.
기본적으로 작은 프로젝트나, 사이드 프로젝트에서는 GC를 튜닝할 정도로 큰 트래픽이 발생하지 않는다. 때문에 기본적인 설정값으로 프로그램을 진행해도 되는데, 스케일이 큰 애플리케이션, 특히 데이터를 많이 쓰고, 스레드들도 많이쓰고, 높은 처리량을 요구하는 애플리케이션 경우에는 성능을 위해 별도의 GC 선택과 튜닝이 필요할 수 있다.
소규모 시스템에서는 별 문제가 안될 GC로 인한 성능 이슈가 대규모 시스템으로 확장될 때는 주요 병목 지점이 될 수 있다.
대규모 시스템에서는 GC 오버헤드를 조금만 낮춰도 성능 향상에 이점이 크기 때문에 적절한 garbage collector를 선택하고 필요하다면 GC 튜닝도 하는 것이 중요하고 가치있는 일이다.
자바는 네 개의 garbage collector를 제공하는데, 그 중 serial GC를 제외하고는 모두 선능 향상을 위해 병렬로 동작한다.
오늘날에 서버-클래스로 분류될수 있는 머신에서 애플리케이션이 실행된다. 보통 디폴트로 G1GC가 사용된다.

Ergonomics

Ergonomics : Jvm이 주어진 환경에서 GC와 메모리 관련 설정을 스스로 최적하는 것.
defatul selection : collector, heap size, GC Threads 수, Jit compiler
실행중 동적 조정
아래 두 가지 목표를 맞추기 위해 사용자가 설정한 목표를 모니터링하여 실행 중에 동적으로 조정
Maximum Pasue-Time goal(-XX:maxGCPasueMillis=nn)
Throughput goal(-XX:GCTimeRatio=nnn)
위 두가지 목표가 모두 충족되는 동안 minimun footprint를 추구하며 동작.

JVM의 주요 default 설정

garbage collector
서버용 머신에는 G1GC, 그 외에는 Serial Collector 사용
판단기준 : 두 개 이상의 프로세서를 가지며 RAM > 1792MB 인 경우
inital heap size : JVM이 시작할 때 바로 확보되는 Heap 크기 : RAM의 1/64
maximum heap size : JVM heap의 최대 크기 RAM의 1/4
minimum heap size : 디폴트 값 설정이 약간 복잡하게 결정됨.
서버 애플리케이션의 경우 [inital heap size, maximum heap size , minimum heap size ] 를 동일하게 맞춰서 최대한 메모리를 사용하게 한다.
명령어
jps -l
51379 com.ic.api.InterviewConnectApiApplication
jcmd 51379 VM.flags
XX:InitialHeapSize=536870912 > 512MB
XX:MaxHeapSize=8589934592 > 8GB
XX:MinHeapSize=8388608 > 8MB
현재 제 컴퓨터 기준 application의 유동적인 JVM

Maximum Pasue-Time goal

pause time : GC로 인해 애플리케이션이 아예 멈추는 시간. 즉 stop-the-world 시간
pause time이 아무리 길어도 maximum-puase-time goal 보다는 적어야된다.
Maximum Pasue-Time goal은 -XX:maxGCPasueMillis=nnn로 지정, 이때 nnn의 단위는 milliseconds.
GC는 pause time에 대한 가중평균과 분산을 계산해서 이 둘의 합을 maximum-puase-time goal 과 비교.
garbage collector는 heap size나 GC 관련 여러파라미터들을 조절해 puase time을 nnn milliseconds보다 작게 유지하려고 시도.
maximum puase-time goal의 디폴트 값은 collector 마다 다름.
그렇다면, JVM의 heap size를 지정한 1초로 맞추기 위해서는 줄여야 되나, 늘려야되나?
1.5 > 1초로 줄이려면 heap size를 작게 가져가야 빠르게 처리 될 것이고, 그렇다면 GC가 더 많이 실행 될 것임.

Throughput goal

Throughput goal: GC Time과 application Time을 비교해서 특정 비율을 맞추도록 하는 것.
GC time : 지금까지 GC에 의해 puase된 시간의 총합을 의미, 즉 stop-the-world가 된 시간의 총합
application time : GC time이외의 타임의 총합
일부 GC 스레드가 애플리케이션과 병렬로 실행된다면, 이 시간도 application time으로 분류됨
Throughput goal은 -XX:GCTimeRatio=nnn로 지정
GC Time ratio = 1 /(1+nnn)로 목표로 설정하는 것.
만약 nnn을 19로 맞춘다면1/20이되고 0.05 측 5%로 맞춘다.
Throughput goal이 충족되지 않으면 GC는 여러방법을 통해 충족시키려고 하는데 그중 하나가 heap size를 늘림
만약 Throughput goal 현재 5%가 아니라 10%라고 가정하였을때,목표치인 5%로 달성하기 위해서는 heap size를 늘려야 된다. application의 시간을 늘려야 됨으로 heap size를 늘려야됨.

Minimum Footprint

Footprint 프로세스가 현재 사용중인 메모리의 크기, heap 크기가 전체 메모리 크기에 가장 영향력이 클 것임.
Maximum Pasue-Time goal과 Throughput goal이 모두 충족 된다면, garbage collector는 heap 사이즈를 조금씩 줄인다.
GC 3부: GC은 왜 필요한가? GC 튜닝은 언제 왜 필요한가? GC의 자동 최적화
안녕하세요 백엔드 전문채널 쉬운코드입니다! 🫡 GC 챌린지 3부를 시작합니다! 오늘부터 드디어 GC 본론으로 들어갑니다. (JVM 기반입니다!) 오늘 다루는 내용은 - GC는 왜 필요하며 - GC 튜닝은 언제 왜 필요하며, - GC의 자동 최적화를 설명드립니다 사용하는 교재는 Java 25의 공식 문서인 HotSpot Virtual Machine Garbage Collection Tuning Guide의 1부 2부를 한번에 다룹니다. - 1부 : https://docs.oracle.com/en/java/javase/25/gctuning/introduction-garbage-collection-tuning.html - 2부 : https://docs.oracle.com/en/java/javase/25/gctuning/ergonomics.html 한시간 ~ 한시간 30분 정도 소요될 것으로 예상합니다! 우리 모두 파이아!! ⏰ 일시 : 2월 2일 월요일 밤 10시에 멤버십 전용 라이브로 진행 그럼 많관부❤️ 🔥 GC 강의는 Improver 이상의 멤버십 전용으로 진행됩니다. 👉 멤버십 가입 링크 : https://www.youtube.com/channel/UCReNwSTQ1RqDZDnG9Qz_gyg/join 00:00 준비 02:01 시작 03:05 감사 03:36 지난 시간 복습 06:47 시작하기에 앞서 용어 정리 10:11 GC가 등장하게 된 배경과 GC의 장단점 21:22 GC의 역할 29:29 GC가 자신의 역할 수행을 위해 사용하는 주요 테크닉 34:30 언제 GC 선택과 튜닝이 중요한가? 39:16 왜 GC 선택과 튜닝이 중요한가? (GC가 병목이 될 수 있음) 49:22 언제 serial GC가 적절한가? 52:23 쉬는 시간 & 중간 Q&A 1:04:52 Ergonomics : JVM이 알아서 하는 자동 최적화! 1:08:58 JVM의 GC와 메모리 관련 주요 default 설정 1:19:05 자동 최적화를 위한 목표1 : Maximum Pause-Time Goal 1:26:47 자동 최적화를 위한 목표2 : Throughput Goal 1:32:41 자동 최적화를 위한 목표3 : Minimum Footprint 1:46:11 GC 튜닝 가이드 1:49:51 Q&A