Serial collector
Mainly for single-cpu machine.
Algorithm:
It use a single thread to handle heap, and perform stop-the-world pause during any gc. Just see it as toy.
This is default for client-class machine (32bit jvm on windows or single-cpu machine).
Parallel collector
Algorithm:
It uses multiple gc threads to handle heap, and perform stop-the-world pause during any gc.
<= Java 8
, this is default for server-class machine (multi-cpu unix-like machine or any 64bit jvm).
CMS collector
It's designed to eliminate the long pause associated with the full gc of parallel & serial collector.
Algorithm:
It use 1 or more gc threads to scan the old generation periodically, and discard unused objects, the pause is very short, but use more cpu time.
Warning: since Java 14
, it's removed.
G1 collector
It's low pause / server style gc, mainly for large heap (> 4Gb).
Algorithm:
- Similar as CMS, it use multiple background gc threads to scan & clear heap.
- It divide old generation into parts, it could clean old generation by copy from 1 part to another.
Thus it's less possible to get fragmentation.
Since Java 9
, this is default for server-class machine (multi-cpu unix-like machine or any 64bit jvm).
Why use G1 as default?
The main reason is to reduce the gc pause time, though the overall throughput might be reduced.
SerialGC
can be used if it is critical for the application to consume as less native memory as possible since along withShenandoah GC
it has one of the smallest overhead. – Zoography