JAVA · 성능/JVM
GC 분석과 튜닝
GC 로그를 분석하고 적절한 가비지 컬렉터를 선택합니다.
성능/JVM고급GCG1ZGC튜닝
핵심 설명
GC 로그를 분석하고 적절한 가비지 컬렉터를 선택합니다.
Java code
// GC 옵션 비교
// -XX:+UseG1GC — G1 (기본, Java 9+)
// -XX:+UseZGC — ZGC (초저지연, Java 15+)
// -XX:+UseShenandoahGC — Shenandoah (저지연)
// GC 로그 활성화
// java -Xlog:gc*:file=gc.log:time,level,tags MyApp
// 주요 GC 튜닝 파라미터
// -Xms4g -Xmx4g — 힙 크기 (최소=최대 권장)
// -XX:MaxGCPauseMillis=200 — G1 목표 일시정지
// -XX:G1HeapRegionSize=16m — G1 리전 크기
public class GCAnalysis {
public static void main(String[] args) {
Runtime rt = Runtime.getRuntime();
System.out.println("=== JVM 메모리 정보 ===");
System.out.printf("최대 힙: %dMB%n", rt.maxMemory() / 1024 / 1024);
System.out.printf("전체 힙: %dMB%n", rt.totalMemory() / 1024 / 1024);
System.out.printf("사용 가능: %dMB%n", rt.freeMemory() / 1024 / 1024);
// GC 정보
java.lang.management.ManagementFactory.getGarbageCollectorMXBeans()
.forEach(gc -> System.out.printf("GC: %s, 횟수: %d, 시간: %dms%n",
gc.getName(), gc.getCollectionCount(), gc.getCollectionTime()));
// 메모리 풀
java.lang.management.ManagementFactory.getMemoryPoolMXBeans()
.forEach(pool -> {
var usage = pool.getUsage();
if (usage != null && usage.getMax() > 0) {
System.out.printf("풀: %s, 사용: %dMB/%dMB%n",
pool.getName(),
usage.getUsed() / 1024 / 1024,
usage.getMax() / 1024 / 1024);
}
});
}
}학습 팁
ZGC는 힙 크기와 관계없이 10ms 이하의 일시정지를 보장합니다. 지연 시간이 중요한 서비스에서는 ZGC를 고려하세요.
주의할 점
-Xms와 -Xmx를 다르게 설정하면 힙 확장 시 GC가 추가 발생합니다. 운영 환경에서는 같은 값으로 설정하세요.
자주 묻는 질문
GC 분석과 튜닝란 무엇인가요?
GC 로그를 분석하고 적절한 가비지 컬렉터를 선택합니다.
GC 분석과 튜닝 학습 시 주의할 점은 무엇인가요?
-Xms 와 -Xmx 를 다르게 설정하면 힙 확장 시 GC가 추가 발생합니다. 운영 환경에서는 같은 값으로 설정하세요.