JVM G1垃圾回收算法简要介绍

G1的特点

  1. 能够像CMS垃圾回收算法一样并发操作应用线程(潜台词:多核)
  2. 无需太长时间即可压缩空闲内存空间(潜台词:不会引起太多的GC停顿时间)
  3. 尽可能地让GC时长可控
  4. 不希望牺牲过多的吞吐量
  5. 不希望因此耗费大量更多的Heap空间

G1的优势

G1作为CMS的长期替代品,有若干点优势:

  1. G1是一个压缩收集器,提供足够强的压缩来完全避免狭小的内存分配
  2. 依赖Regions概念,大大简化收集器逻辑,大部分情况下规避潜在的内存碎片问题
  3. 比CMS的GC停顿时长更加可预测,并允许用户指定停顿时长

G1的收集步骤

Phase 1: Concurrent Global Marking. 并发扫描一遍之后,G1知道了哪些Region里大部分是空的(即大部分是可回收的对象),G1把收集和压缩操作集中于此,因此得名Garbage First.

Phase 2: Evacuation. 并发地将一个或多个Region的资源拷贝至新的Region,压缩内存、拷贝、释放已拷贝完成的Region. 与此相比,CMS没有压缩内存(去除碎片)这一步,ParallelOld垃圾收集只进行全堆压缩.

细节:G1会估算Region的回收时间,以计算在用户指定时间内可回收多少(量力而行),因此G1不是『实时』收集器 :)

G1的建议使用场景

拥有较大Heap空间(6GB及以上)、低停顿时长(0.5ms以内)要求的应用。

现在使用ParallelGC或CMS的应用,如果存在以下问题,可以考虑切换至G1:

  1. Full GC过于频繁、停顿时间过长的应用
  2. 对象分配比例经常发生剧变的应用
  3. 回收或压缩时间太长的应用(高于0.5s到1s)

如果使用ParallelGC或CMS没有发现以上现象,可以不必急于切换到G1,新版JVM仍然支持旧的垃圾回收算法。

G1的注意事项

若从ParallelOldGC或CMS切换至G1,很可能会发现JVM运行内存变大了。这很大程度上要归因于 用于审计的两个数据结构『Remembered Sets』和『Collection Sets』

  1. 『Remembered Sets』每个Region都有一个,用于记录该Region中的对象引用,给G1提供并行独立收集各Region内存的可能性,它带来的负面影响不超5%
  2. 『Collection Sets』记录被收集的Region,它内部的所有数据会被收集干净,它带来的负面影响不超1%

JVM G1垃圾回收算法简要介绍的更多相关文章

  1. JVM(九):垃圾回收算法

    JVM(九):垃圾回收算法 在本文中,我们将从概念模型的角度探讨 JVM 是如何回收对象,包括 JVM 是如何判断一个对象已经死亡,什么时候在哪里进行了垃圾回收,垃圾回收有几种核心算法,每个算法优劣是 ...

  2. jvm详情——3、JVM基本垃圾回收算法回收策略

    JVM基本垃圾回收算法回收策略 引用计数(Reference Counting):比较古老的回收算法.原理是此对象有一个引用,即增加一个计数,删除一个引用则减少一个计数.垃圾回收时,只用收集计数为0的 ...

  3. 深入探究JVM之垃圾回收算法实现细节

    @ 目录 前言 垃圾回收算法实现细节 根节点枚举 安全点 安全区域 记忆集和卡表 写屏障 并发的可达性分析 低延迟GC Shenandoah ZGC 总结 前言 本篇紧接上文,主要讲解垃圾回收算法的实 ...

  4. JVM常见垃圾回收算法

    jdk1.7.0_79 众所周知,Java是一门不用程序员手动管理内存的语言,全靠JVM自动管理内存,既然是自动管理,那必然有一个垃圾内存的回收机制或者回收算法.本文将介绍几种常见的垃圾回收(下文简称 ...

  5. jvm的垃圾回收算法

    一.对象存活判断判断对象是否存活一般有两种方式:1.引用计数:每个对象有一个引用计数属性,新增一个引用时计数加1,引用释放时计数减1,计数为0时可以回收.此方法简单,无法解决对象相互循环引用的问题.2 ...

  6. 深入理解JVM一垃圾回收算法

    我们都知道java语言与C语言最大的区别就是内存自动回收,那么JVM是怎么控制内存回收的,这篇文章将介绍JVM垃圾回收的几种算法,从而了解内存回收的基本原理. 一.stop the world 在介绍 ...

  7. jvm学习-垃圾回收算法(三)

     垃圾回收算法  引用计数法 比较古老的一种垃圾回收算法.在java的GC并没有采用 增加一个引用 引用+1 减少一个引用引用减一 每次清除引用为0的的对象 缺点:不能回收循环引用的垃圾对象 标记清除 ...

  8. JVM中垃圾回收算法

    GC 算法与种类 GC的概念 Garbage Collection 垃圾收集1960年 List 使用了GCJava中,GC的对象是堆空间和永久区 引用计数法 老牌垃圾回收算法通过引用计算来回收垃圾使 ...

  9. 深入理解JVM(五) -- 垃圾回收算法

    上篇文章我们了解到哪些内存区域和哪些对象可以被回收,这篇文章我们就来了解一下具体的垃圾回收算法的思路,不讨论具体的实现. 一 最基础算法 标记-清除(Mark-Swap) 为什么说他是最基础的算法,因 ...

随机推荐

  1. JAVA中空指针异常报错的几种可能坑你的情况

    一.局部变量覆盖掉其他变量导致无法使用. 在做Java客户管理的项目的时候,eclipse报出了个空指针异常的错误,但反复检查也并没感觉出错误,调用的数组给它初始化而且赋值了,但是编译器很顽强的报了一 ...

  2. gulp+webpack+angular1的一点小经验(第二部分webpack包起来的angular1)

    又一周过去了,项目也已经做得有点模样了.收集来一些小经验,分享给大家,有疏漏之处,还望指正,海涵. 上周整合了gulp与webpack,那么工具准备差不多了,我们就开始编码吧.编码的框架就是angul ...

  3. 基于H.ui.Admin UI模板的网站管理后台

    最近接手一个跨境电商平台开发,客户侧重电商网站UI设计,对管理后台要求不高,由我们决定选哪一款后台模板.找来找去,感觉还是H.ui靠谱一些,主要是这个模板清爽,不需要过多选择.其他的流行后台模板也看了 ...

  4. Date、Calendar和GregorianCalendar的使用

    java.util 包提供了 Date 类来封装当前的日期和时间. Date 类提供两个构造函数来实例化 Date 对象. 第一个构造函数使用当前日期和时间来初始化对象. Date public st ...

  5. Scrapy+eChart自动爬取生成网络安全词云

    因为工作的原因,近期笔者开始持续关注一些安全咨询网站,一来是多了解业界安全咨询提升自身安全知识,二来也是需要从各类安全网站上收集漏洞情报. 作为安全情报领域的新手,面对大量的安全咨询,多少还是会感觉无 ...

  6. 漫谈LiteOS之开发板-串口(基于GD32450i-EVAL)

    [摘要] ​主要讲解物联网的技术积累,本期我们先带领大家学习漫谈LiteOS之漫谈开发板第一集-串口,本文基于GD32450i-EVAL对串口以及其通信做了一个简要的分析,以及开发过程中遇到的一些技术 ...

  7. Cookie俩步操作实现n天免登陆

    实现这个功能主要思路是:在登录成功的时候去给用户名和密码加上Cookie,将他们的值存在Cookie中,为了下次登录记住用户名和密码,然后在登录界面,获取所有的cookie,然后将值一一遍历出来.和用 ...

  8. JAVA中SPI机制

    之前研究dubbo的时候就很好奇,里面各种扩展机制,期间也看过很多关于SPI的机制,今日有缘再度看到有文章总结,故记录一下, 首先了解一下 JAVA中SPI简单的用法 可参考这篇文章,https:// ...

  9. 【Feign】自定义配置

    [Feign]自定义配置 转载: 自定义配置,如果在同一个工程,注意配置不要和@SpringBootApplication或@ComponentSacan放在用一个包下,就是不要被扫描上 packag ...

  10. .net access config 相对路径

    <configuration> <connectionStrings> <add name="ConStr" connectionString=&qu ...