GC tự động thu hồi bộ nhớ từ object không còn được tham chiếu — Java dev không cần free() thủ công.
3 bước cốt lõi:
1. Marking — duyệt object graph từ GC roots (stack frame, static field, JNI ref), đánh dấu object reachable.
2. Sweeping — xóa object không được đánh dấu, giải phóng bộ nhớ.
3. Compacting — di chuyển surviving object lại gần nhau, giảm fragmentation.
Loại GC:
- Minor GC: dọn Young Generation (object mới), nhanh, tần suất cao.
- Major/Full GC: dọn Old Generation (object sống lâu), chậm, ảnh hưởng latency.
Pause time quan trọng với latency-sensitive app:
- G1GC (default Java 9+): pause ~100-200ms.
- ZGC (Java 15+): pause <10ms ngay cả heap 100GB+.
- Shenandoah: tương tự ZGC.
Tuning GC bằng JVM flag (-Xmx, -XX:+UseZGC) + monitoring (JFR, GC log) khi performance bị ảnh hưởng.
GC automatically reclaims memory from unreferenced objects — no manual free() in Java.
Three core steps:
1. Marking — traverse the object graph from GC roots (stack frames, static fields, JNI refs), mark reachable objects.
2. Sweeping — delete unmarked objects, free their memory.
3. Compacting — move surviving objects together to reduce fragmentation.
GC types:
- Minor GC: cleans Young Generation (new objects) — fast, frequent.
- Major/Full GC: cleans Old Generation (long-lived objects) — slower, hurts latency.
Pause time matters for latency-sensitive apps:
- G1GC (Java 9+ default): pauses ~100-200ms.
- ZGC (Java 15+): pauses <10ms even on 100GB+ heaps.
- Shenandoah: similar to ZGC.
Tune GC via JVM flags (-Xmx, -XX:+UseZGC) + monitoring (JFR, GC logs) when performance matters.