我是靠谱客的博主 认真书本,最近开发中收集的这篇文章主要介绍【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

最后

以上就是认真书本为你收集整理的【JVM垃圾回收(二)】垃圾处理器(上)垃圾收集器的全部内容,希望文章能够帮你解决【JVM垃圾回收(二)】垃圾处理器(上)垃圾收集器所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(56)

评论列表共有 0 条评论

立即
投稿
返回
顶部