垃圾收集

垃圾寻找的方式是Root Searching。从根节点(GC roots)开始捋引用,没有被寻到的都是垃圾。

垃圾收集算法主要有三种:

  1. Mark-Sweep(标记清除):直接标记清除。
  2. Copying(拷贝):划分区域,把一个区域中存活的对象移动到另一个区域,然后清除掉这个区域。
  3. Mark-Compact(标记压缩):将存活的移动到最前面,然后把后面直接清除。

垃圾收集器就是对这三种算法的应用。一共有10种:
分代的有6种,最常见的三种搭配是:(新生代,老年代)

  1. Serial,Serial Old:单线程收集
  2. Parallel Scavenge,Parallel Old:多线程收集
  3. ParNew,CMS:在标记时候,垃圾收集和标记并发
    不分代分区的有三种:
  4. G1
  5. ZGC
  6. Shenandoah
    啥都没有的:
    Epsilon

分代收集器里面Young中有Eden,Survivor,达到阈值后从Survivor中移到Old区。

当我们new一个对象出来时,首先看能否在栈上分配。进行逃逸分析,然后进行标量替换,就在栈上分配(当方法弹出栈时,对象直接清除)。如果太大(参数确定),直接分配到堆的老年代(老年代中的垃圾回收直接FGC)。如果大小合适,但栈上又分配不下,优先TLAB(线程本地)

JDK 1.8主要是分代模型,默认Parallel Scavenge,Parallel Old,比较好的是G1。