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에 "힌트"만 줍니다. 프로덕션 코드에서는 사용하지 마세요.
Continue Learning
Java 학습을 이어가세요
총 200개의 독립 HTML 학습 문서 중 하나입니다. 각 문서는 고유 URL과 canonical 메타데이터를 가집니다.