Careeroza
Garbage Collection
How GC Decides What to Free
The garbage collector frees objects that are no longer reachable from a GC root: local variables on thread stacks, static fields, active threads, JNI references. Reachability, not reference counting, so circular references are collected fine.
GC roots ──► Order ──► Customer reachable: kept
└─► Cart ──► Item
X ──► OldSession ◄──► OldToken unreachable (even with a cycle): freedGenerational Heap
Most objects die young (request DTOs, temporary strings). So the heap is split into generations:
- New objects go to Eden.
- A minor GC copies live Eden objects to a Survivor space; dead ones are dropped for free.
- Objects that survive several minor GCs are promoted to the Old generation.
- A major / full GC cleans the old generation — slower, longer pauses.
Collectors
| Collector | Flag | Good for |
|---|---|---|
| Serial | -XX:+UseSerialGC | tiny heaps, single-core containers |
| Parallel | -XX:+UseParallelGC | batch jobs: max throughput, pauses OK |
| G1 (default since Java 9) | -XX:+UseG1GC | general servers, pause target -XX:MaxGCPauseMillis=200 |
| ZGC (generational in 21) | -XX:+UseZGC -XX:+ZGenerational | big heaps, sub-millisecond pauses |
| Shenandoah | -XX:+UseShenandoahGC | low pause (OpenJDK builds) |
Example
Turn on GC logging to see collections:
java -Xms512m -Xmx512m -Xlog:gc -jar shop.jarExample output
[0.012s][info][gc] Using G1 [3.481s][info][gc] GC(0) Pause Young (Normal) (G1 Evacuation Pause) 25M->4M(512M) 3.211ms [7.902s][info][gc] GC(1) Pause Young (Normal) (G1 Evacuation Pause) 31M->6M(512M) 2.874ms
Reference Types
| Type | Collected when | Use |
|---|---|---|
| Strong (normal) | never while reachable | everything |
SoftReference | memory is low | memory-sensitive caches |
WeakReference | next GC if only weakly reachable | WeakHashMap, listeners |
PhantomReference | after finalization, for cleanup | Cleaner API |
Note: System.gc() is only a hint. Never rely on it. finalize() is deprecated; use try-with-resources or Cleaner.