【JVM垃圾回收(二)】垃圾处理器(上)

垃圾收集器

java堆内存被划分为新生代和老年代,新生代主要使用复制算法,老年代主要使用标记整理算法,jvm中针对新生代和老年代提供了多种不同的垃圾收集器

Serial

单线程(主要是STW),复制算法,简单高效。

只会用一个cpu/一个线程完成垃圾收集工作,且需要STW

工作新生代(客户端模式下默认使用Serial作为收集器)

SerialOld

单线程,标记整理算法

工作老年代(客户端模式下默认使用SerialOld作为收集器)

ParNew

Serial多线程版本,除了使用了多线程进行垃圾收集之外,其他的和Serial无差,同样采用复制算法,需要STW

默认开启和CPU数目相同的线程数,可通过==-XX:ParallerGCThreads== 限制垃圾收集器的线程数

工作新生代(服务端模式下默认使用ParNew作为收集器)

Parallel Scavenge

新生代收集器,复制算法,多线程并行收集器,

ParNew不同之处:

吞吐量优先收集器

重点关注程序达到一个可控制的吞吐量(高吞吐量可以最高效率地利用CPU时间)

Parallel Old

多线程标记整理算法

Parallel Scavenge的老年代版本

1.6之前,Parallel Scavenge只能搭配SerialOld使用,这样只保证了新生代的吞吐量优先,无法保证整体。引入了Parallel Old后,可以确保整体吞吐量优先的问题

如果系统对吞吐量要求较高,可使用Parallel Scavenge和Parallel Old一起使用

CMS

Concurrent mark sweep,老年代的垃圾收集器,多线程标记清除算法

主要获取最短垃圾回收停顿时间–》可为交互比较高的程序提高用户体验

重视服务的响应速度,希望用户停顿时间最短

但是由于CMS占用了一定的CPU使用量,会对整个程序的吞吐量有一定影响(使用的标记清除算法,会产生较多的内存碎片,造成并发失败,提高了垃圾回收的时间)

工作机制–四个阶段

  1. 初始标记

    标记根对象能直接关联的对象,速度快但需要STW

  2. 并发标记

    进行根对象跟踪的过程(GC),和用户线程一起工作,不需要STW

    重新标记前会先进行新生代的GC

  3. 重新标记

    修正在并发期间因为和用户线程一起工作而导致标记产生变动的那部分对象的标记记录,需要STW

  4. 并发清除

    清楚根对象不可达对象,和用户线程一起工作,不需要STW

所有阶段中,并发标记耗时最长

总体来看,CMS收集器的内存回收和用户线程数一起并发执行的

在这里插入图片描述

在并发清理时,其他并发运行的线程也会产生新的垃圾(浮动垃圾),但是这些垃圾不会在并发清理时被清除,只能等到下一次GC

优点

并发收集、低停顿

缺点

内存碎片化

会产生浮动垃圾

对CPU资源较敏感

对于垃圾收集器,可有一下几种搭配

Serial+Serial Old

Serial+CMS

ParNew+Serial Old

ParNew+CMS

Parallel Scavenge+Parallel Old

Parallel Scavenge+Serial Old

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值