【jvm】垃圾回收

本文深入探讨了Java的垃圾回收机制,包括各种垃圾收集器如Serial、PS、ParNew、CMS、G1等的工作原理及其与内存大小的关系。介绍了JVM的分代模型,强调了内存分代在垃圾回收中的重要性,同时讲解了GC常用算法如Mark-Sweep、Copying和Mark-Compact。此外,还讨论了如何通过JVM命令行参数来调整垃圾回收策略。
摘要由CSDN通过智能技术生成

 

目录

常见的垃圾回收器(背)

serial 年轻代 串行回收

PS 年轻代 并行回收

ParNew(parallel new的缩写) 年轻代 配合CMS的并行回收

SerialOld

ParallelOld

CMS  ConcurrentMarkSweep 老年代 并发的,垃圾回收和应用程序同时进行,降低STW的时间(200ms)

G1(10ms)

ZGC(1ms) PK C++

Shenandoah

Eplison

垃圾收集器与内存大小的关系

 

GC常用算法

Mark-Sweep 标记清除

Copying 拷贝

Mark-Compact 标记压缩

JVM内存分代模型(用于分代垃圾回收算法)

新生代+老年代+元数据区:永久代(1.7)/元数据区(1.8)(metaspace)

 

原理

分配担保

如何定位垃圾

根可达算法

引用计数

垃圾回收的JVM命令行参数


常见的垃圾回收器(背)

jdk诞生时,使用的是serial,为了提高效率,诞生了PS,为了配合CMS(1.4版本后期引用,里程碑式,开启了并发回收:垃圾回收进程和工作进程同时进行),又诞生了PN。但是CMS问题很多,所以默认都不是CMS。

并发垃圾回收器是因为无法忍受STW

PS是并行,多个gc线程同时执行。

CMS是并发,在gc执行的时候,工作线程可以产生新垃圾

  1. serial 年轻代 串行回收

    1. 单线程的GC thread

    2. 当Serial工作时,所有的线程都到safe point点时停止(STW. stop the world)。单CPU效率最高

  2. PS 年轻代 并行回收

    1. 多线程的GC thread

    2. 也是所有线程到safe point点停止工作

    3. 用的是compacting算法

  3. ParNew(parallel new的缩写) 年轻代 配合CMS的并行回收

    1. 同PS:多线程,STW,

    2. 不同:做了一些增加,为了和CMS配合使用

  4. SerialOld

    1. 单线程的GC thread。

    2. 用的是mark-sweep-compact算法

  5. ParallelOld

  6. CMS  ConcurrentMarkSweep 老年代 并发的,垃圾回收和应用程序同时进行,降低STW的时间(200ms)

    1. 并发标记算法:三色标记+ incremental update

    2. concurrent mark sweep 并发标记清除

    3. 过程:

      1. 先初始标记,STW,但是此时只标记根的较少的对象,所以很多

      2. 并发标记,耗费80%的时间,所以工作线程此时可以并发进行

      3. 重新标记,stw,因为并发标记阶段可能会漏,所以此时再标记一次

      4. 并发清理。此时产生的垃圾叫做 浮动垃圾,这些垃圾只能等着下次CMS才能清理

    4. CMS问题比较多,所以现在没有一个版本默认是CMS,只能手工指定。CMS既然是MarkSweep,就一定会有碎片化的问题,碎片到达一定程序,CMS的老年代分配对象分配不下的时候,使用SerialOld进行老年代回收。想象一下:PS+PO->加内存 换垃圾回收器-> PN+CMS+SerialOld(几个小时-几天的STW)。几十个G的内存,单线程回收->G1+FGC 几十个G->上T内存的服务器ZGC

    5. CMS的2大问题

      1. Memory Fragmentation 内存碎片化

        1. -XX:+UseCMSComp

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值