PHpullh
학습 라이브러리/Java/GC 분석과 튜닝

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가 추가 발생합니다. 운영 환경에서는 같은 값으로 설정하세요.

Continue Learning

Java 학습을 이어가세요

총 200개의 독립 HTML 학습 문서 중 하나입니다. 각 문서는 고유 URL과 canonical 메타데이터를 가집니다.