• Java Garbage Collectors


    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

  • 相关阅读:
    vue计算属性和方法的区别
    函数防抖和函数节流
    vue项目使用keep-alive
    hash模式与history模式
    Vue中的计算属性
    MVVM的理解和Vue的生命周期
    session和cookie的区别
    localStorage和sessionStorage区别
    try catch finally的理解
    《Linux命令学习手册》系列分享专栏
  • 原文地址:https://www.cnblogs.com/codingforum/p/6435649.html
Copyright © 2020-2023  润新知