Search code examples
garbage-collectionjvm

Why does the JVM full GC need to stop-the-world?


I think it is because the JVM needs to move objects, is that correct?


Solution

  • First, Garbage Collection article at wikipedia is really good reading.

    In general GC does not require Stop-the-World pause. There are JVM implementations which are (almost) pause free (e.g. Azul Zing JVM). Whenever JVM require STW to collect garbage depends on algorithm it is using.

    Mark Sweep Compact (MSC) is popular algorithm used in HotSpot by default. It is implemented in STW fashion and has 3 phases:

    • MARK - traverse live object graph to mark reachable objects
    • SWEEP - scans memory to find unmarked memory
    • COMPACT - relocating marked objects to defragment free memory

    When relocating objects in the heap, the JVM should correct all references to this object. During the relocation process the object graph is inconsistent, that is why STW pause is required.

    Concurrent Mark Sweep (CMS) is another algorithm in HotSpot JVM which does not utilize STW pause for old space collection (not exactly same thing as full collection).

    CMS is utilizing write barrier (trigger acting each time you are writing reference in Java heap) to implement concurrent version of MARK and does not use COMPACT. Lack of compaction may result in fragmentation and if background garbage collection is not fast enough application can still be blocked. In these cases CMS will fallback to STW mark-sweep-compact collection.

    There is also G1 which is an incremental variation of MSC. You can read more about GC algorithms in HotSpot JVM in my blog.