Java Garbage Collectors

时间:2021-10-06 13:30:58

Generational Collectors (分代收集器)

  • GC algos optimised based on two hypotheses / observations:

    • Most objects soon become unreachable - short lived.

    • References from old objects to young objects only exist in small numbers

  • The Oracle HotSpot JVM:

    • Objects allocated in the Eden space of the Young Generation (or New Generation年轻代)

    • Once the Eden space is full, a young collection or minor collection occurs

    • Surviving objects live in the survivor space of the young generation

    • When an object is “old enough”, it is promoted to the Old Generation (or tenured space年老代)

    • When the old generation is “full enough”, a major collection occurs.

  • Allocation is usually very fast

    • Thread Local Allocation Buffers

    • Bump of pointer

Java Garbage Collectors

  • Available in the Oracle HotSpot JVM:

    • Serial Collector

    • Parallel (Throughput) Collector

    • Concurrent Mark-Sweep Collector (CMS)

    • G1

  • Others:

    • Oracle JRockit Real Time

    • IBM Websphere Real Time

    • Azul Zing

Serial Collector

  • Single threaded for all collections (minor and major)

  • All collections are Stop-The-World (STW)

  • Collections use a mark-sweep-compact algorithm

  • Suitable for single-threaded apps with low memory footprint (~100MB)

  • Enabled using -XX:+UseSerialGC

Parallel Collector

  • Similar to the serial collector, but uses multiple threads to speed things up

  • Offers highest throughput of all the collectors

  • Enabled using ‑XX:+UseParallelGC

Concurrent Mark Sweep (CMS) Collector

  • Boasts shorter pauses than the serial or parallel collectors at the expense of application throughput

  • Minor collections similar to serial collector

  • Old generation is collected concurrently with the application

  • Not compacting, so can result in old generation fragmentation

  • Enabled using -XX:+UseConcMarkSweepGC

G1 Garbage Collector

  • G1 = Garbage First

  • Default GC in Java 9

  • Aims for low pause times (<0.5s) and good throughput (90%) for large heaps (>6GB)

  • Generational and concurrent

  • Adaptive to meet pause time target

  • Enabled with -XX:+UseG1GC

G1 Layout

  • Unlike other collectors, G1 divides the heap into evenly sized regions

  • Regions can be 1MB to 32MB in size, in power of two increments

  • Regions can be dynamically assigned as:

    • Eden

    • Survivor

    • Old

    • Humongous

  • G1 aims for 2048 regions based on minimum heap size

G1 Minor Collections

  • Also known as Evacuation Pauses

  • A STW event

  • Subset of regions logically assigned as the young generation

  • Minor collection triggered when the young generation is full

  • Live objects “evacuated” to new regions to achieve compaction

  • Objects moved to either old region or survivor region based on age

  • Number of regions in young generation can be changed to meet the pause time target

G1 Concurrent Marking

  • Triggered when the used heap reaches a configurable threshold of total heap

  • Aim is to identify which old generation regions can be collected

  • Multi-phased process, some of which is STW, some concurrent with application

  • Concurrent phase can be stopped by a young collection

G1 Mixed Collections

  • Occurs after the concurrent marking phase

  • Old regions optionally added to the eden and survivor regions to be collected

  • Old regions eligible for collection usually split over multiple collections

  • The number of mixed collections is tunable via flags

  • G1 reverts to minor (young) collections when mixed collections have finished

G1 Humongous Objects

  • Humongous object defined as one greater than 50% the size of a region.

  • Allocated directly to the old generation to avoid copying during young collections

  • Region(s) marked as humongous

  • Don’t want too many, and ideally they should be long lived.

G1 Evacuation Failures and Full GC

  • Evacuation failure is when there is no free space to copy objects to

  • Evacuation failures trigger a full GC - very expensive!

G1 Configuration

  • There are many flags. Advice is to not tune G1 much unless you have to.

  • Some flags are experimental, and require -XX:+UnlockExperimentalVMOptions to be set also

  • Primary flag is to control the pause target:
    -XX:MaxGCPauseMillis=200

  • -XX:InitiatingHeapOccupancyPercent=45
    Percentage of heap occupancy at which the marking phase is triggered

  • Many more options described at http://www.oracle.com/technetwork/articles/java/g1gc-1984535.html

  • Some options for GC logging:

    • -XX:+PrintGCDetails - Enable detailed GC logging

    • -XX:+PrintGCDateStamps - Print absolute date stamps at beginning of GC lines

    • -XX:+PrintGCTimeStamps Print a timestamp reflecting the real time passed in seconds since JVM start

GC Logs

    • New log file every time the JVM starts