了解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 ...
随机推荐
- 【repost】javascript:;与javascript:void(0)使用介绍
有时候我们在编写js过程中,需要触发事件而不需要返回值,那么就可能需要这样的写法 最近看了好几个关于<a>标签和javascript:void(0)的帖子,谨记于此,以资查阅. 注:以下代 ...
- 关不掉的小姐姐程序python tkinter实现 学习---打包教程
首先,我们先准备两个.py文件,还要图片文件 代码//是我自己手写的,copy时记得删掉,不然有可能错误,比如中英文啥的 当然 一些语法的无问题就百度,都能给你答案 第一个.py ...
- 消息中间件——activeMQ
Activemq使用教程 解压activmq进入bin\win64 启动activemq.bat 启动成功 浏览器访问http://127.0.0.1:8161 创建maven工程 在pom.xml中 ...
- UNIGUI与UNIURLFRAME的互动
UniSession.JSCode('name_'+MainForm.UniURLFrame1.name+'_'+MainForm.UniURLFrame1.JSName+'.myinput4.inn ...
- JavaScript高级程序设计--函数小记
执行环境和作用域链 每个函数都有自己的执行环境.当执行流进入一个函数时,函数 的环境就会被推入一个环境栈中.而在函数执行之后,栈将其环境弹出,把控制权返回给之前的执行环境. 当代码在一个环境中 ...
- cad2013卸载/安装失败/如何彻底卸载清除干净cad2013注册表和文件的方法
cad2013提示安装未完成,某些产品无法安装该怎样解决呢?一些朋友在win7或者win10系统下安装cad2013失败提示cad2013安装未完成,某些产品无法安装,也有时候想重新安装cad2013 ...
- javascript知识整理之this
js中的this是一个头疼的问题,尤其对于笔者这种初级的菜鸟来讲,下面梳理下this的知识,可以当做是初级进阶也好入门也罢,总归输出的才是自己掌握的: Js中this不是由词法作用域决定的 而是调用时 ...
- SSH配置免密登录
[参考文章]:linux服务器ssh免密码登录 [参考文章]:ssh分发秘钥时出现错误“Permission denied (publickey,gssapi-keyex,gssapi-with-mi ...
- spring boot -thymeleaf-域对象操作
后台代码
- 个人博客搭建( wordpress )
最近同学买了一台虚机( centos7 系统 ).一个域名,让帮忙搭一个个人博客.本着简单快捷,个人博客采用 wordpress 来搭建.为了以后博客系统的迁移方便,使用 docker 来安装 wor ...