【jvm】08-垃圾回收器那么多傻傻分不清?

欢迎关注b站账号/公众号【六边形战士夏宁】,一个要把各项指标拉满的男人。该文章已在github目录收录。

屏幕前的大帅比大漂亮如果有帮助到你的话请顺手点个赞、加个收藏这对我真的很重要。别下次一定了,都不关注上哪下次一定。

1.垃圾收集算法

1.1.标记-复制算法

该算法将内存分为2块均等的,当该区域使用完毕后就一次性复制到另一块区域。在Hotspot中实现即为s0与s1,只不过做了优化吧伊甸园分了出去,目前年轻代的垃圾收集器都是用该算法。标记-复制算法极度浪费空间,在新生代有95%的对象都会被回收掉自然还好,但是在老年代就行不通了于是演变出了后面两种算法。

1.2.标记-清除算法

顾名思义就是将需要回收的垃圾标记后清除缺点为空间不连续无法存放大对象。需要另做处理。

1.3.标记-整理算法

将垃圾清理后排列整齐,缺点为内存地址变动,需要重新修正。

2.垃圾收集器

2.1.Serial收集器

历史悠久的垃圾收集器,收集时必须"Stop The World" ,早期会与Serial Old联用,目前仅剩下单线程服务器才有使用价值。

2.2.Parallel Scavenge收集器

即Serial的多线程版本,早期会与Parallel Old联用,除非内存过小,否则已无使用价值

2.3.ParNew收集器

Parallel Scavenge的优化版本,真正的多线程收集器。自面世后在JDK9以前一直与CMS联用霸占了相当长时间,目前也是优秀的选择。

2.4.Serial Old收集器

早期单线程老年代回收,使用标记整理算法,在CMS并发失败后会默认调用

2.5.Parallel Old收集器

多线程老年代回收,使用标记整理算法,JDK默认使用但一般都会选择CMS

2.6.CMS收集器

Concurrent Mark Sweep跨时代的老年代回收器,后面的垃圾回收器都以CMS为蓝本开发。使用了标记清除,但可以开启整理算法。核心思想采用三色标记思想(白色为可回收,黑色为不可回收,灰色为未处理完毕)。等待所有灰色处理完毕则完成一次迭代。

  • 初始标记(STW) :记录下gc roots直接能引用的对象,速度很快
  • 并发标记 :沿着root向下寻找,时间最长
  • 重新标记 :写屏障 + 增量更新(保存写后数据)。对并发过程中有重新赋值的进行重新标记触发STW,
  • 并发清理 :对白色的垃圾进行清理
  • 并发重置 :重置标记进入下一轮循环
  1. -XX:+UseConcMarkSweepGC:启用cms
  2. -XX:ConcGCThreads:并发的GC线程数
  3. -XX:+UseCMSCompactAtFullCollection:FullGC之后做压缩整理(减少碎片)
  4. -XX:CMSFullGCsBeforeCompaction:多少次FullGC之后压缩一次,默认是0,代表每次FullGC后都会压缩一 次
  5. -XX:CMSInitiatingOccupancyFraction: 当老年代使用达到该比例时会触发FullGC(默认是92,这是百分比) 6. -XX:+UseCMSInitiatingOccupancyOnly:只使用设定的回收阈值(-XX:CMSInitiatingOccupancyFraction设 定的值),如果不指定,JVM仅在第一次使用设定值,后续则会自动调整
  6. -XX:+CMSScavengeBeforeRemark:在CMS GC前启动一次minor gc,目的在于减少老年代对年轻代的引 用,降低CMS GC的标记阶段时的开销,一般CMS的GC耗时 80%都在标记阶段
  7. -XX:+CMSParallellnitialMarkEnabled:表示在初始标记的时候多线程执行,缩短STW
  8. -XX:+CMSParallelRemarkEnabled:在重新标记的时候多线程执行,缩短STW;

2.7.G1收集器

JDK9默认使用收集器,保留了分代收集理论但将内存分为2048个格子,每个格子可以在不同的时机充当不同的区域。主要分为四区:伊甸园,s区,老年区,大对象区。G1的过程与CMS基本一致,不同的是它是全代收集且算法更为复杂。整体上标记整理算法,小区上为标记复制

写屏障 + 原始快照(SATB)(保存写前数据)

  1. -XX:+UseG1GC:使用G1收集器
  2. -XX:ParallelGCThreads:指定GC工作的线程数量 -XX:G1HeapRegionSize:指定分区大小(1MB~32MB,且必须是2的N次幂),默认将整堆划分为2048个分区 -XX:MaxGCPauseMillis:目标暂停时间(默认200ms)
  3. -XX:G1NewSizePercent:新生代内存初始空间(默认整堆5%)
  4. -XX:G1MaxNewSizePercent:新生代内存最大空间 -XX:TargetSurvivorRatio:Survivor区的填充容量(默认50%),Survivor区域里的一批对象(年龄1+年龄2+年龄n的多个年龄对象)总和超过了Survivor区域的50%,此时就会把年龄n(含)以上的对象都放入老年代 -XX:MaxTenuringThreshold:最大年龄阈值(默认15) -XX:InitiatingHeapOccupancyPercent:老年代占用空间达到整堆内存阈值(默认45%),则执行新生代和老年代的混合收集(MixedGC),比如我们之前说的堆默认有2048个region,如果有接近1000个region都是老年代的region,则可能 就要触发MixedGC了
  5. -XX:G1MixedGCLiveThresholdPercent(默认85%) region中的存活对象低于这个值时才会回收该region,如果超过这 个值,存活对象过多,回收的的意义不大。
  6. -XX:G1MixedGCCountTarget:在一次回收过程中指定做几次筛选回收(默认8次),在最后一个筛选回收阶段可以回收一 会,然后暂停回收,恢复系统运行,一会再开始回收,这样可以让系统不至于单次停顿时间过长。
  7. -XX:G1HeapWastePercent(默认5%):gc过程中空出来的region是否充足阈值,在混合回收的时候,对Region回收都是基于复制算法进行的,都是把要回收的Region里的存活对象放入其他Region,然后这个Region中的垃圾对象全部清理掉,这样的话在回收过程就会不断空出来新的Region,一旦空闲出来的Region数量达到了堆内存的5%,此时就会立 即停止混合回收,意味着本次混合回收就结束了。

2.8.ZGC收集器

核心为使用读屏障,缺点为占用内存开销较大。真正意义上的全代收集,目前还在完善中但已可以使用

3.补充知识

3.1.垃圾收集器的选择

JDK 1.8默认使用 Parallel(年轻代和老年代都是) JDK 1.9默认使用 G1。4G以下可以用parallel,4-8G可以用ParNew+CMS,8G以上可以用G1,几百G以上用ZGC。

3.2.记忆集与卡表

Hotspot使用写屏障维护卡表状态,记忆集为抽象概念

3.3.安全点与安全区域

为保证某些操作的原子性所以设置安全点,在安全点的时候才可以进行STW,常见于方法前后。安全区域:在安全点周围未发生赋值等语句则为安全区域。

参考资料

《深入理解Java虚拟机》-周志明

【jvm】08-垃圾回收器那么多傻傻分不清?的更多相关文章

  1. 【JVM】垃圾回收器总结(2)——七种垃圾回收器类型

    七种垃圾回收器类型 GC的约定参数 DefNew——Default New Generation Tenured——Serial Old ParNew——Parallel New Generation ...

  2. 深入理解JVM一垃圾回收器

    上一篇我们介绍了常见的垃圾回收算法,不同的算法各有各的优缺点,在JVM中并不是单纯的使用某一种算法进行垃圾回收,而是将不同的垃圾回收算法包装在不同的垃圾回收器当中,用户可以根据自身的需求,使用不同的垃 ...

  3. jvm学习-垃圾回收器(四)

    说明 各种垃圾回收算法都有各自的优缺点.jvm也并没有只采用一种垃圾算法.并提供几种组合供我根据场景进行选择. jvm内存结构 Person p=new Person(); 1.程序里面创建一个对象会 ...

  4. 深入探究JVM之垃圾回收器

    @ 目录 前言 正文 一.垃圾收集算法 标记-复制 标记-清除 标记-整理 分代回收 二.常用的垃圾回收器 Serial/SerialOld ParNew Parallel Scavenge/Para ...

  5. JVM七大垃圾回收器下篇G1(Garbage First)

    G1回收器:区域化分代式 既然我们已经有了前面几个强大的GC,为什么还要发布Garbage First (G1)GC?  原因就在于应用程序所应对的业务越来越庞大.复杂,用户越来越多,没有GC就不能保 ...

  6. JVM七大垃圾回收器上篇Serial、ParNeW、Parallel Scavenge、 Serial Old、 Parallel Old、 CMS、 G1

    GC逻辑分类 垃圾收集器没有在规范中进行过多的规定,可以由不同的厂商.不同版本的JVM来实现. 由于JDK的版本处于高速迭代过程中,因此Java发展至今已经衍生了众多的GC版本. 从不同角度分析垃圾收 ...

  7. 面试官:说一下JVM常用垃圾回收器的特点、优劣势、使用场景和参数设置

    今天去看牙医,他问我年级轻轻牙齿怎么磨损这么严重?我说,没有人点赞的这些年,我都是咬着牙过来的. Java中的垃圾回收器几乎是面试中的必考点,无论是面试初级,中级还是高级,总免不了要问一问垃圾回收器的 ...

  8. JVM(3) 垃圾回收器与内存分配策略

    文章内容摘自:深入理解java虚拟机 第三章   对象已死? 1. 引用计数算法: 给对象中添加一个引用计数器,每当有一个地方引用它时,计数器值就加1:当引用失效时,计数器值就减1:任何时刻计数器为0 ...

  9. 第三篇:jvm之垃圾回收器

    一.Serial收集器 新生代收集器,在垃圾回收时,必须暂停其他所有的工作线程.即Stop-The-World. 评价:老而无用,食之无味,弃之可惜. 二.ParNew收集器 新生代收集器,seria ...

  10. 一文了解JVM全部垃圾回收器,从Serial到ZGC

    <对象搜索算法与回收算法>介绍了垃圾回收的基础算法,相当于垃圾回收的方法论.接下来就详细看看垃圾回收的具体实现. 上文提到过现代的商用虚拟机的都是采用分代收集的,不同的区域用不同的收集器. ...

随机推荐

  1. 商业爬虫学习笔记day1

    day1 一. HTTP 1.介绍: https://www.cnblogs.com/vamei/archive/2013/05/11/3069788.html http://blog.csdn.ne ...

  2. Shell变量与算术运算

    区分两个 Shell Shell 语言与 Shell 解释器 Shell 语言 写 Shell 脚本使用的是 Shell 语言,Shell 既是一种命令语言,又是一种程序设计语言. 作为命令语言,它交 ...

  3. How is Quality Score Calculated?

    Google determines Quality Score slightly differently for each of the different advertising networks ...

  4. ClassLoad类加载器与双亲委派模型

    1. 类加载器 Class类描述的是整个类的信息,在Class类中提供的方法getName()是根据ClassPath配置的路径来进行类加载的.若类加载的路径为文件.网络等时则必须进行类加载这是就需要 ...

  5. jenkins之代码部署回滚脚本

    #!/bin/bash DATE=`date +%Y-%m-%d_%H-%M-%S` METHOD=$1 BRANCH=$2 GROUP_LIST=$3 function IP_list(){ if ...

  6. zabbix之微信报警

    #:先在企业微信注册一个企业微信号 #:注册好之后,进入微信 #:测试一下 #:获取access_token #:开始获取 #:获取 #:在server端安装pip root@ubuntu:~# ap ...

  7. ACE_Message_Block实现浅析

    ACE_Message_Block实现浅析1. 概述ACE_Message_Block是ACE中很重要的一个类,和ACE框架中的重要模式的实现 如ACE_Reactor, ACE_Proactor, ...

  8. 找出1小时内占用cpu最多的10个进程的shell脚本

    cpu时间是一项重要的资源,有时,我们需要跟踪某个时间内占用cpu周期最多的进程.在普通的桌面系统或膝上系统中,cpu处于高负荷状态也许不会引发什么问题.但对于需要处理大量请求的服务器来讲,cpu是极 ...

  9. feign中开启熔断的书写步骤

    /**   1.在pom.xml中引入依赖    2.在application.yaml中开启hystrix 3.在方法上配置熔断类     4.书写接口的实现类 **/ //1.在pom.xml中引 ...

  10. logrotate没有rotate的排查过程

    前言 背景 xxx,你过来把squid的日志检查一下,是否做了日志切割:于是乎开启了logrotate没有切割日志的排查旅程,em--.只能说过程很爽,平时疲于应付繁琐的事情,难得有点时间能一条线慢慢 ...