【JVM】G1垃圾收集器深入分析
一、和CMS对比
G1 | CMS | |
设计原则 | 首先收集尽可能多的垃圾(Garbage First) | 尽可能少而块地执行GC,以停顿时间为目标 |
垃圾回收时机 | 启发式算法,在老年代找出具有高收集收益的分区进行收集 | 内存耗尽(新生代)或者快耗尽(老年代) |
内存划分 | 将内存划分为一个个相等大小的内存分区(Region),每个区域都可能有四种状态:E(eden)、S(Survial)、O(old)、空闲 | 分为新生代和老年代2块连续的内存空间 |
是否产生垃圾碎片 |
将一组或多组区域(称为回收集 (CSet))中的存活对象以增量、并行的方式复制到不同的新区域来实现压缩,从而减少堆碎片 |
采用标记删除,会产生碎片 |
二、技术细节
1、G1有一个及其重要的特性:软实时(soft real-time)。所谓的实时垃圾回收,是指在要求的时间内完成垃圾回收。“软实时”则是指,用户可以指定垃圾回收时间的限时,G1会努力在这个时限内完成垃圾回收,但是G1并不担保每次都能在这个时限内完成垃圾回收。通过设定一个合理的目标,可以让达到90%以上的垃圾回收时间都在这个时限内。
2、动态调节年轻代和总堆的比例。
整个年轻代内存会在初始空间-XX:G1NewSizePercent(默认整堆5%)与最大空间-XX:G1MaxNewSizePercent(默认60%)之间动态变化,
且由参数目标暂停时间-XX:MaxGCPauseMillis(默认200ms)、需要扩缩容的大小以及分区的已记忆集合(RSet)计算得到。
当然,G1依然可以设置固定的年轻代大小(参数-XX:NewRatio、-Xmn),但同时暂停目标将失去意义。
三、垃圾回收过程
1、YGC
在Eden充满时触发,在回收之后所有之前属于Eden的区块全变成空白。然后把剩余的存活对象移动到S区。
很多情况下,S区的对象会有部分晋升到Old区,另外如果S区已满、Eden存活的对象会直接晋升到Old区,这种情况下Old的空间就会涨
这个过程会对年轻代的对象有一个短暂的停顿
2、并发标记阶段
G1并发标记周期可以分成几个阶段、其中有些需要暂停应用线程。有些是后台并行处理,不需要暂停应用
- 初始标记。需要暂停应用线程这个阶段会暂停所有应用线程。部分原因是这个过程会执行一次YGC
- 并发扫描。后台线程并行处理,不会暂停应用
- 并发标记。在root扫描完成后,G1进入了一个并发标记阶段。这个阶段也是完全后台进行的
- 并发标记阶段是可以被打断的,比如这个过程中发生了YGC就会。这个阶段之后会有一个二次标记阶段和清理阶段。这两个阶段同样会暂停应用线程,但时间很短。接下来还有额外的一次并发清理阶段
3、混合GC
接下来G1执行一系列的混合GC。这个时期因为会同时进行YGC和清理上面已标记为X的区域,所以称之为混合阶段。
每次混合GC只是清理一部分的O区内存,整个GC会一直持续到几乎所有的标记区域垃圾对象都被回收,这个阶段完了之后G1会重新回到正常的YGC阶段。周期性的,当O区内存占用达到一定数量之后G1又会开启一次新的并行GC阶段.
4、FullGC
如果对象内存分配速度过快,mixed gc来不及回收,导致老年代被填满,就会触发 一次full gc,G1的full gc算法就是单线程执行的serial old gc,会导致异常长时间的暂停时间,需要进行不断的调优,尽可能的避免full gc.
【JVM】G1垃圾收集器深入分析的更多相关文章
- 【JVM】7、深入理解Java G1垃圾收集器
本文首先简单介绍了垃圾收集的常见方式,然后再分析了G1收集器的收集原理,相比其他垃圾收集器的优势,最后给出了一些调优实践. 一,什么是垃圾回收 首先,在了解G1之前,我们需要清楚的知道,垃圾回收是什么 ...
- 详解 JVM Garbage First(G1) 垃圾收集器(转载)
前言 Garbage First(G1)是垃圾收集领域的最新成果,同时也是HotSpot在JVM上力推的垃圾收集器,并赋予取代CMS的使命.如果使用Java 8/9,那么有很大可能希望对G1收集器进行 ...
- 深入理解 Java G1 垃圾收集器--转
原文地址:http://blog.jobbole.com/109170/?utm_source=hao.jobbole.com&utm_medium=relatedArticle 本文首先简单 ...
- G1 垃圾收集器
概念先知 什么是垃圾回收 简单的说垃圾回收就是回收内存中不再使用的对象. 垃圾回收的基本步骤: 查找内存中不再使用的对象 释放这些对象占用的内存 查找内存中不再使用的对象 如何判断哪些对象不再被使用呢 ...
- G1垃圾收集器和CMS垃圾收集器 (http://mm.fancymore.com/reading/G1-CMS%E5%9E%83%E5%9C%BE%E7%AE%97%E6%B3%95.html#toc_8)
参考来源 JVM 体系架构 堆/栈的内存分配 静态和非静态方法的内存分配 CMS 回收算法 应用场景 CMS 垃圾收集阶段划分(Collection Phases) CMS什么时候启动 CMS缺点 G ...
- G1 垃圾收集器入门
最近在复习Java GC,因为G1比较新,JDK1.7才正式引入,比较艰难的找到一篇写的很棒的文章,粘过来mark下.总结这篇文章和其他的资料,G1可以基本稳定在0.5s到1s左右的延迟,但是并不能保 ...
- 转 G1垃圾收集器入门
转自:http://blog.csdn.net/zhanggang807/article/details/45956325 最近在复习Java GC,因为G1比较新,JDK1.7才正式引入,比较艰难的 ...
- 转:深入理解Java G1垃圾收集器
本文首先简单介绍了垃圾收集的常见方式,然后再分析了G1收集器的收集原理,相比其他垃圾收集器的优势,最后给出了一些调优实践. 一,什么是垃圾回收 首先,在了解G1之前,我们需要清楚的知道,垃圾回收是什么 ...
- G1垃圾收集器入门-原创译文
G1垃圾收集器入门-原创译文 原文地址 Getting Started with the G1 Garbage Collector 概览 目的 本文介绍了如何使用G1垃圾收集器以及如何与Hotspot ...
随机推荐
- 201671030113 李星宇 实验十四 团队项目评审&课程学习总结
项目 内容 所属课程 [所属课程(https://www.cnblogs.com/nwnu-daizh/) 作业要求 作业要求 课程学习目标 (1)掌握软件项目评审会流程:(2)反思总结课程学习内容 ...
- 02-赵志勇机器学习-Logistics_Regression-test(转载)
# coding:UTF-8 ''' Date:20160901 @author: zhaozhiyong ''' import numpy as np from lr_train import si ...
- 01-赵志勇机器学习-Logistics_Regression-train
Logistics Regression 二分类问题. 模型 线性模型 响应 sigmoid 损失函数(显示) 最小均方 优化方法 BGD 例子: #coding utf-8 import numpy ...
- Echarts在同一网页按顺序展示多图
Echarts Page:同一网页按顺序展示多图 from pyecharts import Page page = Page("") page.add(pie).add(frie ...
- 网络协议 16 - DNS 协议
为什么在地址栏输入域名,就能直接访问到对应服务器?全局负载均衡和内部负载均衡又是什么?这些都和 DNS 解析息息相关,让我们一起来解密 DNS 解析. 其实说起 DNS 解析,应该都知道它很像 ...
- PATA1001A+BFormat
这里学到的主要是将数字存储到数组中,倒序输出使用取余10加除10 while(sum) { num[len++] = sum % 10; sum /= 10; } 然后是每三位输出一个逗号,因为是倒序 ...
- python3 ini文件读写
import configparser config = configparser.ConfigParser() file = 'config.ini' config.read(file) confi ...
- [Gamma]Scrum Meeting#9
github 本次会议项目由PM召开,时间为6月4日晚上10点30分 时长15分钟 任务表格 人员 昨日工作 下一步工作 木鬼 撰写博客,组织例会 撰写博客,组织例会 swoip 前端显示屏幕,翻译坐 ...
- html中利用flex容器书写的布局样式
首先页面基本样式见下图: 如有兴趣可以打开https://migloo.gitee.io/front 或者 https://www.igloo.xin/front 进行查看
- Java编程思想之十 内部类
可以将一个类定义放在另一个类的定义内部,这就是内部类. 10.1 创建内部类 创建内部类就是把类的定义置于外部类里面. public class Parcell { class contents{ i ...