垃圾收集器和垃圾回收算法

垃圾回收算法:

名称 介绍 缺点 适用场景
标记清除 标记垃圾对象后清除 产生内存碎片,不利于下次GC分配内存,以及垃圾对象的清除 老年代垃圾回收,老年代垃圾对象少
复制 将一半内存中的存活对象复制到另一半当中,清除垃圾对象 内存利用率降低,当大量对象存活时,复制性能很低 新生代垃圾回收,新生代存活对象少
标记整理 标记垃圾对象并清除后,还会整理内存空间 需要维护对象指针引用,耗费额外的性能 一般用于老年代和内存吃紧的情况

垃圾收集器分为两大类:

分代收集
新生代
名称 算法
serial 复制算法
parallel 复制算法
parNew 复制算法

老年代
serial Old 标记整理
parallel Old 标记整理
CMS 标记清除

分区收集
名称
G1
ZGC

垃圾回收器收集主要过程

配合使用 jvm参数 线程 过程 优点 缺点

serial +

serial Old

-XX:+UseSerialGC

-XX:+UseSerialOldGC

单GC线程

垃圾回收过程由单线程执行,STW(停止用户线程)

简单高效 STW用户体验不好

parallel +

parallel Old

-XX:+UseParallelGC

-XX:+UseParallelOldGC

多GC线程

垃圾回收过程由多线程并发执行,STW,jdk8默认使用

吞吐高,cpu利用高,可精准控制 用户体验不好
parNew + CMS

-XX:+UseParNewGC

-XX:+UseConcMarkSweepGC

多GC线程

垃圾回收过程如下

初始标记 STW GC线程标记出gc root能直接引用的对象
并发标记 GC线程和用户线程并行

GC线程会从gc root出发标记出间接引用的对象。由于并发执行,已经标记过的对象状态可能会改变

重新标记 STW GC线程修正并发标记过程中已经标记过对象状态
并发清理 GC线程和用户线程并行 GC线程对未标记的对象清理
并发重置 GC线程和用户线程并行 GC线程重置标记过的对象

在并发失败情况下(GC还在执行,但是新的对象还在产生导致内存不够用),会STW并由serial Old代替CMS处理

用户体验好,吞吐量高 对cpu资源敏感,无法收集浮动垃圾,容易产生大量内存碎片(可配置jvm参数在清除后整理解决)

你可能感兴趣的:(java,jvm)