了解java虚拟机—G1回收器(9)
G1(Garbage-First)回收器是在JDK1.7中正式使用的全新垃圾回收器,G1拥有独特的垃圾回收策略,从分代上看,G1依然属于分代垃圾回收器,它会区分年代和老年代,依然有eden和survivor区,但从堆的结构上看,它并不要求整个eden区、年清代或者老年代都连续。它使用了全新的分区算法。其特点如下:
l 并行性:G1在回收期间,可以由多个GC线程同时工作,有效利用多核计算能力。
l 并发性:G1拥有与应用程序交替执行的能力,因此一般来说,不会在整个回收期间完全阻塞应用程序。
l 分代GC:与之前回收器不同,其他回收器,它们要么工作在年轻代要么工作在老年代。G1可以同时兼顾年轻代与老年代。
l 空间整理:G1在回收过程中,会进行适当的对象移动,不像CMS,只是简单的标记清除,在若干次GC后CMS必须进行一次碎片整理,G1在每次回收时都会有效的复制对象,减少空间碎片。
l 可预见性:由于分区的原因,G1可以只选取部分区域进行内存回收,这样缩小了回收范围,因此对于全局停顿也能得到更好的控制。
G1的内存划分和主要收集过程
G1的收集过程可能有4个阶段:1.新生代GC 2.并发标记周期 3.混合收集 4.如果需要,可能会进行fullGC。
1.G1新生代GC
新生代GC只处理eden和survivor区,回收后所有eden区域都应该清空,survivor区会被清空一部分数据,但是应该至少存在一个survivor区。
2. G1的并发标记周期
l 初始标记:标记从根节点直接可达的对象。这个阶段会伴随一次新生代GC,它是会产生全局停顿的。
l 根区域扫描:由于初始标记必然会产生一次新生代GC,所以在初始标记后,eden被清空,并且存活对象移入survivor区。在这个阶段将扫描由survivor区直接可达的老年代区域,并标记这些直接可达的对象,这个过程是可以和应用程序并发执行的。
l 并发标记:和CMS类似,并发标记会扫描并查找整个堆的存活对象,并做好标记。这是一个并发的过程,并且会被新生代GC打断。
l 重新标记:和CMS标记一样,重新标记会产生一次卡顿。由于并发标记过程中,应用程序依然在运行,因此标记结果可能需要修正(程序在运行eden区有可能进入新的对象),所以在此对上一次的标记结果进行补充。在这个过程中使用SATB(Snapshot At The Beginning)算法完成,即G1会在标记之初为存活对象春哥见一个快早,这个快早有助于加速重新标记速度。
l 独占清理:这个阶段会引起程序卡顿。它将计算各个区域的存活对象和GC回收比例并进行排序,识别可供混合回收的区域。还会更新记忆集(RemebereSet)。该阶段给出了需要被混合回收的区域并进行了标记。
l 并发清理:这个阶段会识别并清理完全空闲的区域,他是并发清理的,不会引起卡顿。
3.混合回收
在并发标记周期中,虽然有部分对象被回收,但是总体上这部分回收的比例是相当低的。但是在并发标记后,G1已经明确知道哪些区域含有比较多的垃圾对象,在混合回收阶段可以专门针对这些区域进行回收。这个阶段即会执行正常的年轻代Gc又会选取一些被标记的老年代区域进行回收,它同事处理了新生代和老年代。混合Gc会执行多次,知道回收了足够多的内存空间,之后会触发一次新生代GC。新生代GC后又可能触发一次并发标记周期,最后又引起混合GC的执行。
4.必要时的FullGC
和CMS类似,并发收集器由于让应用程序与GC线程交替执行,因此总是不能避免在特别繁忙的场景会出现在回收过程中内存不足的情况,当遇到这种情况时G1也会转入一个FullGC回收。此外如果在混合GC发生空间不足或者新生代GC时,survivor区和老年代无法容纳幸存对象,都会导致一次FullGC。
了解java虚拟机—G1回收器(9)的更多相关文章
- 了解java虚拟机—CMS回收器(8)
CMS(Concurrent Mark Sweep)回收器 它使用的是标记清除算法,同时又是一个使用多线程并行回收的垃圾回收器. CMS主要工作步骤 CMS工作时主要步骤有初始标记.并发标记.预清理. ...
- 了解java虚拟机—并行回收器(7)
并行回收器 新生代ParNew回收器 ParNew只是简单地将串行回收器多线程化,他的回收策略,算法以及参数都喝新生代串行回收器一样.由于并行回收器使用多线程进行垃圾回收,因此,在并发能力强的CPU上 ...
- 实战Java虚拟机之三“G1的新生代GC”
今天开始实战Java虚拟机之三:“G1的新生代GC”. 总计有5个系列 实战Java虚拟机之一“堆溢出处理” 实战Java虚拟机之二“虚拟机的工作模式” 实战Java虚拟机之三“G1的新生代GC” 实 ...
- Java虚拟机解析篇之---垃圾回收器
上一篇说了虚拟机的内存模型,在说到堆内存的时候我们提到了,堆内存是Java内存中区域最大的一部分,而且垃圾回收器主要就是回收这部分的内容.那么这篇就来介绍一下垃圾回收器的原理以及回收的算法. Java ...
- java架构之路-(JVM优化与原理)JVM之G1回收器和常见参数配置
过去的几天里,我把JVM内部的垃圾回收算法和垃圾回收器.还剩下最后一个G1回收器没有说,我们今天数一下G1回收器和常见的参数配置. G1回收器 G1 (Garbage-First)是一款面向服务器的垃 ...
- JVM学习(1)——通过实例总结Java虚拟机的运行机制
俗话说,自己写的代码,6个月后也是别人的代码……复习!复习!复习!涉及到的知识点总结如下: JVM的历史 JVM的运行流程简介 JVM的组成(基于 Java 7) JVM调优参数:-Xmx和-Xms ...
- Java虚拟机详解----JVM常见问题总结
[声明] 欢迎转载,但请保留文章原始出处→_→ 生命壹号:http://www.cnblogs.com/smyhvae/ 文章来源:http://www.cnblogs.com/smyhvae/p/4 ...
- Java虚拟机内存模型及垃圾回收监控调优
Java虚拟机内存模型及垃圾回收监控调优 如果你想理解Java垃圾回收如果工作,那么理解JVM的内存模型就显的非常重要.今天我们就来看看JVM内存的各不同部分及如果监控和实现垃圾回收调优. JVM内存 ...
- 《深入Java虚拟机学习笔记》- 第9章 垃圾收集
一.Java内存组成 组成图 堆(Heap) 运行时数据区域,所有类实例和数组的内存均从此处分配.Java虚拟机启动时创建.对象的堆内存由称为垃圾回收器的自动内存管理系统回收. 组成 组成 详解 Yo ...
随机推荐
- 简单好用的时间选择插件My97datepicker
我们经常会需要验证字符串的格式,比如密码长度范围.电子邮件格式.固定电话号码和手机号码格式等,这个时候我们经常会需要用到正则表达式.但是正则表达式用起来性能会低一点,所以在需要验证的时候能不使用正则表 ...
- SWPU-ACM集训队周赛之组队赛(3-11) C题题解
点这里去看题 模拟,注意细节 #include<stdio.h> #include<string.h> int main() { ]; //q[]储存正负信息 scanf(&q ...
- SWPU-ACM集训队周赛之组队赛(3-11)G题题解
点这里去做题 水水水水水,不难发现如下表 t 1 2 3 4 v 1 3 5 7 s 1 4 9 16 明显s=t*t 题目中对10000取模即取后四位,即对1000取余 #include<st ...
- 9.3AspectJ
1.1 介绍 AspectJ是一个基于Java语言的AOP框架 Spring2.0以后新增了对AspectJ切点表达式支持 @AspectJ 是AspectJ1.5新增功能,通过JDK5注解技术,允许 ...
- 札记:翻译-使用Scene和Transition实现【场景切换】动画效果
简述:transitions framework 下面翻译transition为"过渡",强调动画过程的含义,不过更多时候使用transition单词本身. Android 4.4 ...
- sudo rm -rf iTunes.app Operation not permitted
https://www.howtogeek.com/230424/how-to-disable-system-integrity-protection-on-a-mac-and-why-you-sho ...
- JavaCV 学习(一):JavaCV 初体验
最近工作中因为项目的原因边学边用,接触并使用JavaCV做了一些相关的产品,目前觉得,JavaCV在图形图像(人家本身就是一个视觉库)的功能真的挺强大,而且使用起来避免了复杂的平台处理.下面整理一下对 ...
- Linux - YUM包管理
简述 rpm是由红帽公司开发的软件包管理方式,使用rpm可以方便的进行软件的安装.查询.卸载.升级等工作. 但是rpm软件包之间的依赖性问题往往会很繁琐,尤其是软件由多个rpm包组成时. Yum(全称 ...
- .NET手记-HttpClient解析GB2312乱码问题
最近为App的服务器端卸了个爬虫程序,输出结果时发现出现乱码现象,尝试使用了几个方案发现效果并不太好,最后发现了一个很简单的用法. var result = await client.GetByteA ...
- Liferay7 BPM门户开发之20: 理解Asset Framework
Asset框架用于将您开发的门户内容添加Liferay的核心系统功能.打个比方,你开发了一个事件TodoList管理的插件,在列表显示的时候,你可以集成Asset框架,让你的自定义内容支持Tag标签. ...