JVM:G1垃圾回收器

http://blog.jobbole.com/109170/

https://blog.csdn.net/baiye_xing/article/details/73743395 G1垃圾收集器关键技术。


===G1垃圾回收器是如何划分堆空间的呢?

G1垃圾回收器将内存分成一个个小块区域,这些小块区域的大小可以是1M,2M,4M,8M等等,并且这些小块区域可以是eden,survivor,old,以及humongous区域。其中humongous用来存大对象,如果一个对象超过某块空间的1/2的时候就会被认为是大对象来进行处理。

===G1如何进行对象空间分配的呢?

对于一个线程来说它有自己的eden区域,如果不够用就会使用公共的eden区域,再不够就使用老年代

===G1垃圾回收器有哪些GC的算法呢?

G1提供了三种GC模式,Young GC,old GC和Mixed GC,两种都是Stop The World(STW)的。

1.youngGC,eden区域空间耗尽了就进行的垃圾回收。

eden优先到survivor,不够就到老年代,survivor也会转移到新的survivor或者到老年代中去。目的是直到eden区域清空为止。

===young GC中如何标记被老年代引用的新生代呢?如何避免扫描所有的老年代?

因为有些老年代引用到新生代的对象,为了避免扫描整个老年代,所以使用卡表记录。

---CMS中在老年代有个RS(Remember set记录集合)数据区域记录指向新生代的引用:所以老年代中有个RS区域记录了老年代对新生代的引用,这样直接扫描这个RS区域就可以了不需要扫描整个老年代。

---G1中在每个分区使用卡表数组来进行记录Card Table。卡表记录这个分区的每个位置的使用情况,如果被引用了就标记成0,同时也在RS中进行记录。

我的理解就是老年代有个RS哈希表,键是某块新生代起始地址,value就是卡表,卡表里面记录哪块区域被引用,这样直接就扫这个RS和卡表就能够知道老年代引用了新生代什么对象了。

2.MIX GC混合式GC

当老年代的空间降低到一定程度了就触发Mix Gc。

过程很像CMS垃圾回收。主要分为两个步骤:全局并发标记和拷贝存活对象

---initial mark: 初始标记过程,整个过程STW,标记了从GC Root可达的对象

---concurrent marking: 并发标记过程,整个过程gc collector线程与应用线程可以并行执行,标记出GC Root可达对象衍生出去的存活对象,并收集各个Region的存活对象信息

---remark: 最终标记过程,整个过程STW,标记出那些在并发标记过程中遗漏的,或者内部引用发生变化的对象

---clean up: 垃圾清除过程,如果发现一个Region中没有存活对象,则把该Region加入到空闲列表中

---并发扫描过程中的三色标记算法

有黑色(根对象或者扫描过的对象),灰色(正在扫描对象),和白色(未扫描对象)三种。

---并发过程中可能出现的对象丢失问题如何解决呢?如何去标记被修改了的对象呢?

在并发修改的时候可能导致一个对象丢失的情况。比如以上C对象就被丢失掉了。如何解决呢?

CMS的解决方式:如果一个白对象被黑对象引用,直接就变成灰色。

G1中使用的方式是:开始标记的时候生成快照(STAB,snapshot-at-the-beginning),并发标记的时候某个对象被修改了就直接插入写屏障write barrier。

3.老年代GC

如果对象内存分配速度过快,mixed gc来不及回收,导致老年代被填满,就会触发 一次full gc,G1的full gc算法就是单线程执行的serial old gc,会导致异常长时间的暂停时间,需要进行不断的调优,尽可能的避免full gc.

===调优参数设置

最大暂停时间MaxGCPauseMillis

如果MaxGCPauseMillis设置的过小,那么GC就会频繁,吞吐量就会下降。如果MaxGCPauseMillis设置的过大,应用程序暂停时间就会变长。G1的默认暂停时间是200毫秒,我们可以从这里入手,调整合适的时间。

原文地址:https://www.cnblogs.com/buptyuhanwen/p/9414235.html

时间: 2024-10-21 11:18:51

JVM:G1垃圾回收器的相关文章

029、大厂面试题:最新的G1垃圾回收器的工作原理,你能聊聊吗?

本文是个人学习<从 0 开始带你成为JVM实战高手>内容总结,详细内容扫描二维码 1.ParNew + CMS的组合让我们有哪些痛点? STW,G1垃圾回收器比~更好的垃圾回收性能 2.G1垃圾回收器 G1 同时回收新生代和老年代的对象,把java堆拆分为多个大小相等的Region.最大特点:可以设置垃圾回收‘预期停顿时间’,G1全权负责达到这个目标,控制来及回收对性能的影响 3.G1是如何做到对垃圾回收导致的系统停顿可控的? 1-通过把内存拆分为大量小Region. 2-追踪每个Region

G1垃圾回收器

垃圾回收器的发展历程 背景 01.G1解决的问题 G1垃圾回收器是04年正式提出,12开始正式支持,在17年作为JDK9默认的垃圾处理器. 在04年的时候,java程序堆的内存越来越大,从而导致程序中可存活的活对象越来越多,因此GC的STW时间越来越长.这是G1要解决的主要问题:STW带来的停顿时间太长了. CMS在此之前效率也很高,但活对象数量一多,STW时间也很长.而且CMS无法解决内存碎片化的问题. G1还解决的问题是:CMS在GC后,无法compact内存. 02.G1达成的目标 (1)

031、动手实验:线上系统部署如果采用G1垃圾回收器,应该如何设置参数?

本文是个人内容总结,详细内容扫描二维码 1.前文回顾 1.G1中有新 .老.大三种Region 2.新生代回收条件:新生代Eden区满的时候 3.新生代GC仍然采用复制算法 4.控制停顿时间,对Region进行挑选回收 5.进入老年的条件: (1)熬过了一定次数的GC (2)动态年龄判定规则 (3)存活对象在Survivor放不下 2.什么时候触发新生代+老年代的混合垃圾回收? -XX:InitiatingHeapOccupancyPercent,默认值是45%,表示如果老年代占据了堆内存的45

JVM中的G1垃圾回收器

我们先回顾一下主流Java的垃圾回收器(HotSpot JVM).本文是针对堆的垃圾回收展开讨论的. 堆被分解为较小的三个部分.具体分为:新生代.老年代.持久代. 绝大部分新生成的对象都放在Eden区,当Eden区将满,JVM会因申请不到内存,而触发Young GC ,进行Eden区+有对象的Survivor区(设为S0区)垃圾回收,把存活的对象用复制算法拷贝到一个空的Survivor(S1)中,此时Eden区被清空,另外一个Survivor S0也为空.下次触发Young GC回收Eden+S

jvm之垃圾回收器

一.垃圾回收器简介 1.概念:垃圾回收器是用来自动管理虚拟机中内存的,包括自动分配和自动回收的功能,免去了由程序员来释放内存的麻烦. 2.原因:因为由程序员自己释放内存很可能会出现各种问题,如内存泄露或者悬挂引用,从而导致程序终止. 二.常见垃圾回收算法 1.引用计数器法 (1)实现思路:当新的引用指向新的对象时:对象的计数器加1,当引用失效时,对象的计数器减1:当引用计数器的值变为0时,该对象可以被垃圾回收器回收. (2)优缺点: I.优点:实现原理非常简单. II.缺点:不能解决循环引用的孤

JVM 的垃圾回收器详解

Parallel Scavenge(Paraller):Parallel Scavenge和ParNew关注的点不一样:ParNew关注的是尽可能缩短暂停的时间,Parallel Scavenge关注的是吞吐量吞吐量 = 运行用户代码时间/(运行用户代码时间+垃圾收集时间)举个例子:虚拟机运行100分钟,GC用了1分钟,吞吐量则为99%.停顿时间短的适合用户交互的程序(web前端应用),提高用户体验度.关注吞吐量,什么样的程序下关注吞吐量而不是非常注重交互及时性,主要是这种后台计算任务.Para

JVM学习--(五)垃圾回收器

上一篇我们介绍了常见的垃圾回收算法,不同的算法各有各的优缺点,在JVM中并不是单纯的使用某一种算法进行垃圾回收,而是将不同的垃圾回收算法包装在不同的垃圾回收器当中,用户可以根据自身的需求,使用不同的垃圾回收器,以便让自己的java程序性能到达最佳. 在介绍垃圾回收器之前,我们先回顾一下java堆的结构. 堆内存回顾 java堆内存结构包括:新生代和老年代,其中新生代由一个伊甸区和2个幸存区组成,2个幸存区是大小相同,完全对称的,没有任何差别.我们把它们称为S0区和S1区,也可以称为from区和t

垃圾回收器种类

在这篇教程中我们将学习几种现有的垃圾回收器.在Java中,垃圾回收是一个自动的进程可以替代程序员进行内存的分配与回收这些复杂的工作.这篇是垃圾回 收教程系列的第三篇,在前面的第2部分我们看到了在Java中垃圾回收是如何工作的,那是篇有意思的文章,我推荐你去看一下.第一部分介绍了Java的垃 圾回收,主要有JVM体系结构,堆内存模型和一些Java术语. Java有四种类型的垃圾回收器: 串行垃圾回收器(Serial Garbage Collector) 并行垃圾回收器(Parallel Garba

Java GC 垃圾回收器的类型小结

阅读了java paper的垃圾回收器类型文章,在此做一个小结,文章部分翻译自java paper gc collector,部分自己做的总结,图片来自网络,在此仅用作理解表达之用. 一.JVM GC 垃圾回收器类型 JVM的垃圾回收器大致分为四种类型: (图片来自网络) 1.串行垃圾回收器  Serial Garbage Collector 串行垃圾回收器在进行垃圾回收时,它会持有所有应用程序的线程,冻结所有应用程序线程,使用单个垃圾回收线程来进行垃圾回收工作. 串行垃圾回收器是为单线程环境而