g1专为大内存,多内核机型设计。可以兼顾高吞吐量和低暂停时间。

g1将堆分为多个相同大小内存块,并发的标记线程,使得g1掌握了各个内存块的活对象数量,

内存回收阶段,g1根据用户指定的暂停时间,选择部分内存块进行回收。选择死对象占比高的

内存块可以使得暂停时间最短。

g1采用标记复制算法,在内存回收时解决了不连续的问题。这是cms不具备的

g1可以保证应用在使用内存较大的堆时,有较短的延迟。6G堆可以低于0.5s gc延迟。

g1在逻辑上也分为新生代和老年代。同时为大对象分配了专门区域。

g1在标记复制过程中,如果发现无内存可用,会引发分配失败,从而出发 full gc(stop the world)

g1在复制对象时也会有暂停,young gc和mixed gc都会有

-XX:InitiatingHeapOccupancyPercent=<NN> 指定了开始标记周期的条件,当堆的占用比例达到NN时,开始标记周期,为mixed gc做准备。

-XX:GCPauseIntervalMillis=<NN> 可以指定最短多长可以进行一次gc

g1内存模型中的内存块的大小根据堆大小的不同而不同,内存块总的数量不会超过2048个

young gc时,g1调整新生代的大小从而达到暂停时间的目标

mixed gc时,为了达成目标,g1调整每次回收老年代的内存块数量,每个区域中活对象的占比和堆内存的浪费比例。

g1使用多个独立的记忆表来存储,各个区域的对象对应的引用。多个独立的记忆表使得各个回收线程独立工作在不同区域。

新生代的垃圾回收:

将存活对象在eden,一个sur复制到另一个sur中。存活了指定代的对象,转移到老年代。

—XX:MaxTenuringThreshold=指定存活多少代然后转移。

g1在标记循环完成前进行young gc ,完成后进行mixed gc。

标记周期的各个阶段:

初始化标记:标记root,这个阶段在young gc(stop the world)中完成

根区域扫描:

并发标记:

重新标记:

清理:

g1是自适应的垃圾回收器,可以在默认情况下自我调整,从而高效工作。

默认参数:

-XX:G1HeapRegionSize=n:目标是region总数量不超过2048

-XX:MaxGCPauseMillis=200

-XX:G1NewSizePercent=5:新生代占堆的最小比例

-XX:G1MaxNewSizePercent=60:新生代占堆的最大比例

-XX:ParallelGCThreads=n

-XX:ConcGCThreads=n

-XX:InitiatingHeapOccupancyPercent=45:标记周期开始的条件:堆内对象占堆的百分比,达到之后开始标记周期,为mixed gc做准备

-XX:G1MixedGCLiveThresholdPercent=85,内存占用达到85的old region,被列入mixed gc的对象。

-XX:G1HeapWastePercent=5:可回收的内存超过这个比例时,g1才开始mixed gc的周期

-XX:G1MixedGCCountTarget=8:多少个回收

-XX:G1OldCSetRegionThresholdPercent=10,每个回收多少个old region 

-XX:G1ReservePercent=10:预留内存

使用g1的建议:

1.不要设置新生代的大小,因为这样会覆盖掉暂停时间目标的设定,也就是说,只要设置暂停时间目标就好。

2.g1:应用时间:gc时间=90:10,对于parallel,应用时间:gc时间=99:1,追求短的暂停时间,必然会造成吞吐量的下降。

3.对以下参数进行试验,调整。

  • -XX:InitiatingHeapOccupancyPercent: Use to change the marking threshold.

  • -XX:G1MixedGCLiveThresholdPercent and -XX:G1HeapWastePercent: Use to change the mixed garbage collection decisions.

  • -XX:G1MixedGCCountTarget and -XX:G1OldCSetRegionThresholdPercent: Use to adjust the CSet for old regions.

g1基于标记复制算法,to space不足会报错:

解决办法:

-XX:G1ReservePercent 增加to space大小

-XX:InitiatingHeapOccupancyPercent 减小开始标记的阈值

-XX:ConcGCThreads  增加回收线程

大于g1 region一半的对象会被分配到大对象区域,每个大对象分配在一个region中,大量略微大于region一半的对象,会造成内存不连续,浪费了内存。

此时应该提高region大小,—XX:G1HeapRegionSize这些对象就不会被分配到大对象区域了。

(四)G1 garbage collector的更多相关文章

  1. Getting Started with the G1 Garbage Collector(译)

    原文链接:Getting Started with the G1 Garbage Collector 概述 目的 这篇教程包含了G1垃圾收集器使用和它如何与HotSpot JVM配合使用的基本知识.你 ...

  2. G1 Garbage Collector and Shenandoah

    http://www.diva-portal.se/smash/get/diva2:754515/FULLTEXT01.pdf https://is.muni.cz/th/ifz8g/GarbageC ...

  3. JVM(四) G1 收集器工作原理介绍

    此篇文章半原创是对参考资料中的知识点进行总结,欢迎评论指点,谢谢!        部分知识点总结来自R大的帖子,下文有参考资料的链接 概述 G1 收集是相比于其他收集器(可见 上一篇文章),可以独立运 ...

  4. 提交并发量的方法:Java GC tuning :Garbage collector

    三色算法,高效率垃圾回收,jvm调优 Garbage collector:垃圾回收器 What garbage? 没有任何引用指向它的对象 JVM GC回收算法: 引用计数法(ReferenceCou ...

  5. [GC]一个简单的Garbage Collector的实现

    前言: 最近看了google的工程师写的一个非常简单的垃圾收集器,大概200多行C代码,感叹大牛总能够把复杂的东西通过很简单的语言和代码表达出来.为了增加自己的理解,决定把大牛的想法和代码分析一遍,与 ...

  6. 一个简单的Garbage Collector的实现

    一个简单的Garbage Collector的实现 前言: 最近看了google的工程师写的一个非常简单的垃圾收集器,大概200多行C代码,感叹大牛总能够把复杂的东西通过很简单的语言和代码表达出来.为 ...

  7. AGC027 B - Garbage Collector 枚举/贪心

    目录 题目链接 题解 代码 题目链接 AGC027 B - Garbage Collector 题解 对于一组选取组的最优方案为,走到一点,然后顺着路径往回取点 设选取点坐标升序为{a,b,c,d} ...

  8. New Garbage Collector http://wiki.luajit.org/New-Garbage-Collector

    New Garbage Collector http://wiki.luajit.org/New-Garbage-Collector GC Algorithms This is a short ove ...

  9. agc 027 B - Garbage Collector

    B - Garbage Collector https://agc027.contest.atcoder.jp/tasks/agc027_b 题意: x坐标轴上n个垃圾,有一个机器人在从原点,要清扫垃 ...

随机推荐

  1. linux常用命令-帮助命令man,whatis,apropos,info,help

    man 命令 man 配置文件,注意这里只需要写文件名称就可以了,不能写文件的绝对路径 man既可以查看命令的帮助信息也可以查看配置文件的帮助信息,如果内容太多,可以输入"/内容" ...

  2. Ural 1057 Amount of Degrees

    Description 问[L,R]中有多少能表示k个b次幂之和. Sol 数位DP. 当2进制时. 建出一个二叉树, \(f[i][j]\) 表示长度为 \(i\) 有 \(j\) 个1的个数. 递 ...

  3. 3.从Node.js操作MongoDB文档

    1.更新文档结构,而非SQL 2.数据库更新运算符 在MongoDB中执行对象的更新时,需要确切的指定需要改变什么字段.需要如何改变.不像SQL语句建立冗长的查询字符串来定义更新. MongoDB中可 ...

  4. oracle常用脚本

    自动启动oracle sqlplus -S sys/123456 as sysdba <<EOF startup quit EOF lsnrctl start lsnrctl reload

  5. Spark集群部署

    Spark是通用的基于内存计算的大数据框架,可以和hadoop生态系统很好的兼容,以下来部署Spark集群 集群环境:3节点 Master:bigdata1 Slaves:bigdata2,bigda ...

  6. 去哪儿网输入框三种输入方式(selenium webdriver 干货)

    在机票预定的页面,输入出发城市和到达城市输入框的时候, 发现直接使用sendkeys不好使, 大部分情况出现输入某城市后没有输入进去, 经过几天的研究,发现可以采取三种方式: 1. 先点击输入框,待弹 ...

  7. session超时时间设置方法

    session超时时间设置方法 由于session值之前没有设置,以至于刚登录的网站,不到一分钟就超时了,总结了一下,原来是session过期的原因,以下是设置session时间的3个方法: 1. 在 ...

  8. c# ContinueWith 用法

    通过任务,可以指定在任务完成之后,应开始运行之后另一个特定任务.例如,一个使用前一个任务的结果的新任务,如果前一个任务失败了,这个任务就应执行一些清理工作.任务处理程序都不带参数或者带一个对象参数,而 ...

  9. Git配置姓名和邮箱问题

    今天在安装Git for windows完成后,配置姓名和邮箱.按照廖雪峰老师的步骤,在开始菜单里找到"Git"->"Git Bash",单击后并没有跳出 ...

  10. seajs和requirejs

    一.seajs 1. 使用seajs的一般步骤 a)在主页面引入sea.js b)写模块 c)在主页面使用模块 2.模块的写法 math.js define(function(require, exp ...