G1收集器

G1(Garbage-First)是JDK7-u4才推出商用的收集器;

1、特点

(A)、并行与并发

能充分利用多CPU、多核环境下的硬件优势;

可以并行来缩短"Stop The World"停顿时间;

也可以并发让垃圾收集与用户程序同时进行;

(B)、分代收集,收集范围包括新生代和老年代

能独立管理整个GC堆(新生代和老年代),而不需要与其他收集器搭配;

能够采用不同方式处理不同时期的对象;

虽然保留分代概念,但Java堆的内存布局有很大差别;

将整个堆划分为多个大小相等的独立区域(Region);

新生代和老年代不再是物理隔离,它们都是一部分Region(不需要连续)的集合;

更多G1内存布局信息请参考:

《垃圾收集调优指南》 9节:http://docs.oracle.com/javase/8/docs/technotes/guides/vm/gctuning/g1_gc.html#garbage_first_garbage_collection

(C)、结合多种垃圾收集算法,空间整合,不产生碎片

从整体看,是基于标记-整理算法;

从局部(两个Region间)看,是基于复制算法;

这是一种类似火车算法的实现;

都不会产生内存碎片,有利于长时间运行;

(D)、可预测的停顿:低停顿的同时实现高吞吐量

G1除了追求低停顿处,还能建立可预测的停顿时间模型;

可以明确指定M毫秒时间片内,垃圾收集消耗的时间不超过N毫秒;

2、应用场景

面向服务端应用,针对具有大内存、多处理器的机器;

最主要的应用是为需要低GC延迟,并具有大堆的应用程序提供解决方案;

如:在堆大小约6GB或更大时,可预测的暂停时间可以低于0.5秒;

用来替换掉JDK1.5中的CMS收集器;

在下面的情况时,使用G1可能比CMS好:

(1)、超过50%的Java堆被活动数据占用;

(2)、对象分配频率或年代提升频率变化很大;

(3)、GC停顿时间过长(长于0.5至1秒)。

是否一定采用G1呢?也未必:

如果现在采用的收集器没有出现问题,不用急着去选择G1;

如果应用程序追求低停顿,可以尝试选择G1;

是否代替CMS需要实际场景测试才知道。

3、设置参数

"-XX:+UseG1GC":指定使用G1收集器;

"-XX:InitiatingHeapOccupancyPercent":当整个Java堆的占用率达到参数值时,开始并发标记阶段;默认为45;

"-XX:MaxGCPauseMillis":为G1设置暂停时间目标,默认值为200毫秒;

"-XX:G1HeapRegionSize":设置每个Region大小,范围1MB到32MB;目标是在最小Java堆时可以拥有约2048个Region;

更多关于G1参数设置请参考:

《垃圾收集调优指南》 10.5节:http://docs.oracle.com/javase/8/docs/technotes/guides/vm/gctuning/g1_gc_tuning.html#important_defaults

4、为什么G1收集器可以实现可预测的停顿

G1可以建立可预测的停顿时间模型,是因为:

可以有计划地避免在Java堆的进行全区域的垃圾收集;

G1跟踪各个Region获得其收集价值大小,在后台维护一个优先列表;

每次根据允许的收集时间,优先回收价值最大的Region(名称Garbage-First的由来);

这就保证了在有限的时间内可以获取尽可能高的收集效率;

5、一个对象被不同区域引用的问题

一个Region不可能是孤立的,一个Region中的对象可能被其他任意Region中对象引用,判断对象存活时,是否需要扫描整个Java堆才能保证准确?

在其他的分代收集器,也存在这样的问题(而G1更突出):

回收新生代也不得不同时扫描老年代?

这样的话会降低Minor GC的效率;

解决方法:

无论G1还是其他分代收集器,JVM都是使用Remembered Set来避免全局扫描:

每个Region都有一个对应的Remembered Set;

每次Reference类型数据写操作时,都会产生一个Write Barrier暂时中断操作;

然后检查将要写入的引用指向的对象是否和该Reference类型数据在不同的Region(其他收集器:检查老年代对象是否引用了新生代对象);

如果不同,通过CardTable把相关引用信息记录到引用指向对象的所在Region对应的Remembered Set中;

当进行垃圾收集时,在GC根节点的枚举范围加入Remembered Set;

就可以保证不进行全局扫描,也不会有遗漏。

6、G1收集器运作过程

不计算维护Remembered Set的操作,可以分为4个步骤(与CMS较为相似)。

(A)、初始标记(Initial Marking)

仅标记一下GC Roots能直接关联到的对象;

且修改TAMS(Next Top at Mark Start),让下一阶段并发运行时,用户程序能在正确可用的Region中创建新对象;

需要"Stop The World",但速度很快;

(B)、并发标记(Concurrent Marking)

进行GC Roots Tracing的过程;

刚才产生的集合中标记出存活对象;

耗时较长,但应用程序也在运行;

并不能保证可以标记出所有的存活对象;

(C)、最终标记(Final Marking)

为了修正并发标记期间因用户程序继续运作而导致标记变动的那一部分对象的标记记录;

上一阶段对象的变化记录在线程的Remembered Set Log;

这里把Remembered Set Log合并到Remembered Set中;

需要"Stop The World",且停顿时间比初始标记稍长,但远比并发标记短;

采用多线程并行执行来提升效率;

(D)、筛选回收(Live Data Counting and Evacuation)

首先排序各个Region的回收价值和成本;

然后根据用户期望的GC停顿时间来制定回收计划;

最后按计划回收一些价值高的Region中垃圾对象;

回收时采用"复制"算法,从一个或多个Region复制存活对象到堆上的另一个空的Region,并且在此过程中压缩和释放内存;

可以并发进行,降低停顿时间,并增加吞吐量;

G1收集器运行示意图如下:

更多G1收集器信息请参考:

《垃圾收集调优指南》 9节 Garbage-First Garbage Collector:http://docs.oracle.com/javase/8/docs/technotes/guides/vm/gctuning/g1_gc.html#garbage_first_garbage_collection

《垃圾收集调优指南》 10节 Garbage-First Garbage Collector Tuning:http://docs.oracle.com/javase/8/docs/technotes/guides/vm/gctuning/g1_gc_tuning.html#g1_gc_tuning

java虚拟机收集器_Java虚拟机(JVM)垃圾回收器G1收集器 - Break易站相关推荐

  1. JVM垃圾回收器-G1垃圾收集器

    Java8的G1垃圾回收器官方文档参考:https://docs.oracle.com/javase/8/docs/technotes/guides/vm/gctuning/g1_gc.html#ga ...

  2. JVM垃圾回收——G1垃圾收集器

    目录 一.什么是G1垃圾收集器 二.G1垃圾收集器的内存划分 三.G1垃圾收集器的收集过程 四.G1收集器的优缺点 五.G1收集器的JVM参数配置 一.什么是G1垃圾收集器 Garbage First ...

  3. java9 g1垃圾收集器_Java 9中默认为G1垃圾收集器的情况

    java9 g1垃圾收集器 在前面的几篇文章中,我已经在InfoQ上介绍并讨论了"垃圾第一垃圾收集器" -G1:一个由所有垃圾收集器来统治它们以及调整垃圾第一垃圾收集器的技巧 . ...

  4. JVM垃圾回收器G1详解

    1.概述 在我们应用程序所应对的业务越来越庞大.复杂,用户越来越多,没有GC就不能保证应用程序正常进行,而经常造成STW的GC又跟不上实际的需求,我们需要不断地尝试对GC进行优化.G1(Garbage ...

  5. java map大小_Java中HashMap的size()方法: HashMap.size() - Break易站

    Java中的HashMap HashMap类的java.util.HashMap.size()方法用于获取哈希映射HashMap中映射的大小,该映射引用Map中键值对或映射的数量. 句法: Hash_ ...

  6. java中同步_在Java中的方法同步和语句同步(块同步) - Break易站

    Java 多线程 线程主要通过共享对字段的访问和参考字段引用的对象进行通信.这种通信形式非常有效,但可能出现两种错误:线程干扰和内存一致性错误.需要一些同步构造来防止这些错误.以下示例显示了我们需要同 ...

  7. java 几种垃圾回收器,关于java:7种jvm垃圾回收器这次全部搞懂

    前言 之前咱们解说了jvm的组成构造与垃圾回收算法等知识点,明天咱们来讲讲jvm最重要的堆内存是如何应用垃圾回收器进行垃圾回收,并且如何应用命令去配置应用这些垃圾回收器. 堆内存详解 [腾讯云]云产品 ...

  8. java String如何回收_java中的垃圾回收

    原文-http://blog.csdn.net/zsuguangh/article/details/6429592 1. 垃圾回收的意义 在C++中,对象所占的内存在程序结束运行之前一直被占用,在明确 ...

  9. java SE 费用_Java SE 6中的垃圾回收器G1收费是虚惊一场

    [51CTO快译]在Sun宣布Java SE 6 update 14版本中的垃圾回收器G1将收费之后,引起了Java社区相当大的反响.之后不久的6月5日,有一个细心的匿名读者发表了这样一个帖子: &q ...

最新文章

  1. C#写的NoSQL开源项目/系统(系列)
  2. ASP.NET学习笔记 1
  3. Python+OpenCV 平移、旋转、缩放、翻转
  4. sqlserver 性能问题
  5. oracle sql 艺术,Oracle PL/SQL 从if 到 then的“艺术鉴赏”
  6. 基于 iframe 的全新微前端方案
  7. 《高效程序员的45个习惯》-之二
  8. 编程技能和做员工的技能——哪个更重要?
  9. 【原】获取数据库(SQL SERVER 2005)的所有信息 Get all database information from SQL Server 2005 测试通过...
  10. 基于权重的节点驱逐 - Oracle RAC 12.2 新特性
  11. 全国电费余额查询API接口
  12. 怎么查看无线路由器连接的设备连接服务器,路由器怎么看几个人连接
  13. 【转】中国只有俩导演,一个叫贾樟柯,一个叫姜文
  14. PPP、PPPOE、PPTP、L2TP应用场合
  15. Django2.0+小程序技术打造微信小程序助手百度云
  16. 指数和个股的对数收益率正态性检验
  17. 索尼在线商城的产品会不会更便宜?
  18. 手机怎么解决同ip多账号_抖音播放量低怎么办?如何提高抖音播放量上热门?...
  19. python可视化疫情事实报告(pyecharts)——可视化
  20. C语言if语句学习,判断年龄并且提示语句!

热门文章

  1. 机刷实名认证软件_最好的手机秒变pos机app:刷卡取现从此不求人!
  2. 基于MATLAB的柑橘等级分类系统
  3. win10跨网段共享计算机,win10系统电脑之间实现跨网段共享打印机的恢复教程
  4. Discuz论坛无法上传头像/ 企业邮箱被归为垃圾邮件的问题
  5. 在线求F4V格式播放器代码
  6. thymeleaf 调用java,thymeleaf模板引擎调用java类中的方法(附源码)
  7. 用C#生成Excel文件的方法和Excel.dll组件生成的方法
  8. python字体类型_python 设置xlabel,ylabel 坐标轴字体大小,字体类型
  9. windows类书的学习心得(zz)
  10. CentOS 7 minimal安装与使用(cpp-py) opencv静态编译