PHpullh
학습 라이브러리/Java/JVM 메모리 모델 & GC 이해

JAVA · 성능/JVM

JVM 메모리 모델 & GC 이해

JVM의 Heap 구조, GC 알고리즘, 메모리 튜닝의 핵심을 이해합니다.

성능/JVM고급JVMHeapGCG1GCZGC

핵심 설명

JVM의 Heap 구조, GC 알고리즘, 메모리 튜닝의 핵심을 이해합니다.

Java code

// JVM 메모리 구조 이해를 위한 코드

public class JvmMemory {

    // static 변수 — Method Area (Metaspace)
    private static final int MAX_SIZE = 1000;
    private static int instanceCount = 0;

    // 인스턴스 변수 — Heap
    private final int id;
    private byte[] data;

    public JvmMemory(int size) {
        this.id   = ++instanceCount;
        this.data = new byte[size];  // Heap 할당
    }

    public static void main(String[] args) {
        // JVM 옵션 예시:
        // -Xms512m      : 초기 Heap 크기
        // -Xmx2g        : 최대 Heap 크기
        // -XX:+UseG1GC  : G1 GC 사용
        // -XX:+UseZGC   : ZGC (Java 15+, 저지연)
        // -verbose:gc   : GC 로그 출력

        // Runtime으로 메모리 정보 확인
        Runtime rt = Runtime.getRuntime();
        System.out.println("가용 프로세서: " + rt.availableProcessors());
        System.out.printf("총 메모리: %,d bytes%n", rt.totalMemory());
        System.out.printf("최대 메모리: %,d bytes%n", rt.maxMemory());
        System.out.printf("사용 가능: %,d bytes%n", rt.freeMemory());

        // 메모리 누수 예시 — static 컬렉션에 계속 추가
        // static List<Object> leaky = new ArrayList<>();
        // while(true) leaky.add(new byte[1024]);  // OOM!

        // 약한 참조 — GC가 회수 가능
        var weakRef = new java.lang.ref.WeakReference<>(new byte[1024]);
        System.gc(); // 힌트 (보장 안 됨)
        System.out.println("약한 참조 살아있나: " + (weakRef.get() != null));

        // String intern — String Pool 활용
        String s1 = new String("hello").intern();
        String s2 = "hello";
        System.out.println(s1 == s2); // true (같은 Pool 객체)

        // 효율적인 객체 생성
        // Bad:  for(int i=0;i<1000;i++) new Integer(i);
        // Good: Integer.valueOf(i) — 캐시 활용 (-128~127)
    }
}

// GC 알고리즘 비교 (JVM 옵션):
// Serial GC    : -XX:+UseSerialGC     (단일 스레드, 소형 앱)
// Parallel GC  : -XX:+UseParallelGC   (처리량 우선)
// G1 GC        : -XX:+UseG1GC         (Java 9+ 기본, 균형)
// ZGC          : -XX:+UseZGC          (Java 15+, 초저지연 <1ms)
// Shenandoah   : -XX:+UseShenandoahGC (RedHat, 저지연)

학습 팁

Java 21 기준 ZGC가 가장 낮은 Stop-the-World 시간(<1ms)을 제공합니다. G1 GC는 대부분의 서버 애플리케이션에 적합한 기본값입니다.

주의할 점

System.gc()는 GC를 강제하지 않고 JVM에 "힌트"만 줍니다. 프로덕션 코드에서는 사용하지 마세요.

자주 묻는 질문

JVM 메모리 모델 & GC 이해란 무엇인가요?

JVM의 Heap 구조, GC 알고리즘, 메모리 튜닝의 핵심을 이해합니다.

JVM 메모리 모델 & GC 이해 학습 시 주의할 점은 무엇인가요?

System.gc() 는 GC를 강제하지 않고 JVM에 "힌트"만 줍니다. 프로덕션 코드에서는 사용하지 마세요.