JVM-垃圾收集器G1

G1垃圾回收器

概述:
  • 是一款面向服务器的垃圾收集器,主要针对配备多个处理器及大容量内存的机器
  • 以极高效率满足GC停顿时间要求的同时,还具备高吞吐量性能特征.
  • G1保留了年轻代和老年代的概念,但不再是物理隔阂了,它们都是(可以不连续)Region的集合。

特点:
  • 使用参数:G1垃圾收集器:-XX:+UseG1GC
  • 将Java堆内存 拆分成很多大小相等的Region。每个Region大小计算规则?
    •  Region 基于堆大小默认计算。(堆大小设置:-Xms -Xmx)
      • 计算方式: 如 4G堆大小 ,每个Region的大小就是2MB=4096MB/2048个Region。
      • 规则:Region 必须是2的倍数 如1MB 2MB...
      • 手动调整:-XX:G1HeapRegionSize
  • Region的区域功能 可能会动态变化
    • 一个Region可能之前是年轻代,如果Region进行了垃圾回收,之后可能又会变成老年代。
  • 可设置垃圾回收预期时间。
    • 目的: 尽量把垃圾回收时间控制在一个指定的时间范围内。
G1在各个分代特性
新生代:
  • 初始新生代对堆内存的占比5%。(eg:4G堆内存 占200M、约100Region)
    • 新生代占比调整:XX:G1NewSizePercent     (正常情况维持默认即可)
  • 依旧存在Edgen和Survivor的概念
    • 新生代、老年代区分各自占据不同Region
    • 新生代Region区分可通过 -XX:SurvivorRatio=8 比例区分
      •  如:100个Region,可能80个Region就是Eden,两个Survivor各自占10个Region。
  • 对象不停的在新生代里分配,新生代的Region会不断增加,Eden和Survivor对应的Region也会不断增加。
老年代:
  • G1的内存模型下,新生代(max=60%)和老年代各自都会占据一定的Region。(max=40%)
  • 对象什么时候进去老年代?(规则同CMS进入老年代不同在于大对象的处理)
    • 达到一定年龄(对象在新生代躲过了很多次的垃圾回收
      •  “-XX:MaxTenuringThreshold”参数可以设置这个年龄,他就会进入老年代
    • 动态年龄判定规则
      • 发现某次新生代GC过后,存活对象超过了Survivor的50%
      • 判断eg:年龄为1岁,2岁,3岁,4岁的对象的大小总和超过Survivor的50%,
      • 此时4岁以上的对象全部会进入老年代,这就是动态年龄判定规则。             
G1内存模型下对大对象的分配和回收的策略
  • G1垃圾收集器对于对象什么时候会转移到老年代跟之前讲过的原则一样,唯一不同的是对大对象的处理,
  • G1有专门分配 大对象的Region叫Humongous区,而不是让大对象直接进入老年代的Region中。
  • 在G1中,大对象的判定规则就是一 个大对象超过了一个Region大小的50%,比如按照上面算的,每个Region是2M,只要一个大对象超过了1M,就会被放 入Humongous中。
  • 一个大对象如果太大,可能会横跨多个Region来存放。 Humongous区专门存放短期巨型对象,不用直接进老年代,可以节约老年代的空间,避免因为老年代空间不够的GC开 销
  • Full GC的时候除了收集年轻代和老年代之外,也会将Humongous区一并回收。           
           

G1收集器一次GC的运作过程

初始标记(initial mark,STW):
  • 暂停所有的其他线程,并记录下gc roots直接能引用的对象,速度很快 ;
并发标记(Concurrent Marking):
  • 同CMS的并发标记
最终标记(Remark,STW):
  • 同CMS的重新标记
筛选回收(Cleanup,STW):
  • 筛选回收阶段首先对各个Region的回收价值和成本进行排序,根据用户所期 望的GC停顿时间(可以用JVM参数 -XX:MaxGCPauseMillis指定)来制定回收计划
    • 比如说老年代此时有1000个 Region都满了,但是因为根据预期停顿时间,本次垃圾回收可能只能停顿200毫秒,那么通过之前回收成本计算得 知,可能回收其中800个Region刚好需要200ms,那么就只会回收800个Region(Collection Set,要回收的集 合),尽量把GC导致的停顿时间控制在我们指定的范围内。
  • 这个阶段其实也可以做到与用户程序一起并发执行,但 是因为只回收一部分Region,时间是用户可控制的,而且停顿用户线程将大幅提高收集效率。
  • 不管是年轻代或是老 年代,回收算法主要用的是复制算法,将一个region中的存活对象复制到另一个region中,这种不会像CMS那样 回收完因为有很多内存碎片还需要整理一次,G1采用复制算法回收几乎不会有太多内存碎片。(注意:CMS回收阶 段是跟用户线程一起并发执行的,G1因为内部实现太复杂暂时没实现并发回收,不过到了Shenandoah就实现了并 发收集,Shenandoah可以看成是G1的升级版本)

G1高效回收实现

  • G1收集器在后台维护了一个优先列表,每次根据允许的收集时间,优先选择回收价值最大的Region(这也就是它的名字Garbage-First的由来),
    • 比如一个Region花200ms能回收10M垃圾,另外一个Region花50ms能回收20M垃圾,在回收时间有限情况下,G1当然会优先选择后面这个Region回收
  • 这种使用Region划分内存空间以及有优先级的区域回收方式,保证了G1收集器在有限时间内可以尽可能高的收集效率。

G1的重要特性

并行与并发
  • G1能充分利用CPU、多核环境下的硬件优势,使用多个CPU(CPU或者CPU核心)来缩短Stop-The-World停顿时间。部分其他收集器原本需要停顿Java线程来执行GC动作,G1收集器仍然可以通过并发的方式让java程序继续执行。
分代收集
  • 虽然G1可以不需要其他收集器配合就能独立管理整个GC堆,但是还是保留了分代的概念。
空间整合
  • 与CMS的“标记--清理”算法不同,G1从整体来看是基于“标记整理”算法实现的收集器;从局部上来看是基于“复制”算法实现的。
可预测的停顿
  • 这是G1相对于CMS的另一个大优势,降低停顿时间是G1 和 CMS 共同的关注点,
  • 但G1 除了追求低停顿外,还能建立可预测的停顿时间模型,能让使用者明确指定在一个长度为M毫秒的时间片段(通过参数"XX:MaxGCPauseMillis"指定)内完成垃圾收集
毫无疑问, 可以由用户指定期望的停顿时间是G1收集器很强大的一个功能, 设置不同的期望停顿时间, 可使得G1在不 同应用场景中取得关注吞吐量和关注延迟之间的最佳平衡。 不过, 这里设置的“期望值”必须是符合实际的, 不能异想 天开, 毕竟G1是要冻结用户线程来复制对象的, 这个停顿时 间再怎么低也得有个限度。 它默认的停顿目标为两百毫秒, 一般来说, 回收阶段占到几十到一百甚至接近两百毫秒都很 正常, 但如果我们把停顿时间调得非常低, 譬如设置为二十毫秒, 很可能出现的结果就是 由于停顿目标时间太短, 导 致每次选出来的回收集只占堆内存很小的一部分 收集器收集的速度逐渐跟不上分配器分配的速度, 导致垃圾慢慢堆 积。 很可能一开始收集器还能从空闲的堆内存中获得一些喘息的时间, 但应用运行时间一长就不行了, 最终占满堆引发 Full GC反而降低性能, 所以通常把期望停顿时间设置为一两百毫秒或者两三百毫秒会是比较合理的。

G1垃圾收集分类 

YoungGC 
  • YoungGC并不是说现有的Eden区放满了就会马上触发,G1会计算下现在Eden区回收大概要多久时间,如果回收时 间远远小于参数 -XX:MaxGCPauseMills 设定的值那么增加年轻代的region,继续给新对象存放,不会马上做Young GC,直到下一次Eden区放满,G1计算回收时间接近参数 -XX:MaxGCPauseMills 设定的值,那么就会触发Young GC 
MixedGC 
  • 不是FullGC,老年代的堆占有率达到参数(-XX:InitiatingHeapOccupancyPercent)设定的值则触发,回收所有的 Young和部分Old(根据期望的GC停顿时间确定old区垃圾收集的优先顺序)以及大对象区,
  • 正常情况G1的垃圾收集是先做 MixedGC,主要使用复制算法,需要把各个region中存活的对象拷贝到别的region里去,拷贝过程中如果发现没有足够 的空region能够承载拷贝对象就会触发一次Full GC 
Full GC 
  • 停止系统程序,然后采用单线程进行标记、清理和压缩整理,好空闲出来一批Region来供下一次MixedGC使用,这 个过程是非常耗时的。(Shenandoah优化成多线程收集了)

G1垃圾收集器优化建议 

  • 假设参数 -XX:MaxGCPauseMills 设置的值很大,导致系统运行很久,年轻代可能都占用了堆内存的60%了,此时才 触发年轻代gc。 那么存活下来的对象可能就会很多,此时就会导致Survivor区域放不下那么多的对象,就会进入老年代中。 
  • 或者是你年轻代gc过后,存活下来的对象过多,导致进入Survivor区域后触发了动态年龄判定规则,达到了Survivor 区域的50%,也会快速导致一些对象进入老年代中。
  • 所以这里核心还是在于调节 -XX:MaxGCPauseMills 这个参数的值,在保证他的年轻代gc别太频繁的同时,还得考虑 每次gc过后的存活对象有多少,避免存活对象太多快速进入老年代,频繁触发mixed gc.

什么场景适合使用G1

1. 50%以上的堆被存活对象占用
2. 对象分配和晋升的速度变化非常大
3. 垃圾回收时间特别长,超过1秒
4. 8GB以上的堆内存(建议值)
5. 停顿时间是500ms以内

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/440999.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Apache服务的搭建与配置

一、apache安装 systemctl stop firewalldsystemctl disable firewalldsetenforce 0yum -y install httpdsystemctl start httpdnetstat -ntlp | grep 80 二、认识主配置文件 # vim /etc/httpd/conf/httpd.conf ServerRoot "/etc/httpd" #定义工作目…

【linux驱动开发】IO模型之同步IO、异步IO、IO多路复用

文章目录 IO的概述IO模型的实现阻塞IO非阻塞IOIO多路复用信号驱动异步IO 编译与测试说明 IO的概述 io,英文名称为inoput与output,表示输入与输出。 在冯诺依曼结构计算机中,计算机由 运算器、控制器、存储器、输入、输出五部分组成&#xf…

华为云开年采购季Web及移动App上云体验,助力软件行业创新发展

随着云化、智能化浪潮的进一步深入,越来越多的应用软件开发商选择将核心产品从本地IDC机房搬迁到公有云上。但同时,软件开发商们也非常在意公有云厂商的可靠性与安全性,希望能够选择一家更加稳定可靠的云服务商,确保自身业务的连续…

MS2548,自动方向控制、半双工 RS-485 收发器,可替代MAX13487

产品简述 MS2548 是一个 5V 供电、半双工 RS-485 收发器。 芯片具有自动换向控制功能,可用于隔离 485 端口, 驱动器输入与使能信号一起配合控制芯片的状态, 驱动差分总线。 芯片内部集成热插拔保护和过温保护功能。接 收器输入阻抗为 1…

华为OD机试真题-测试用例执行计划

测试用例执行计划 题目描述: 某个产品当前迭代周期内有N个特性({F1,F2,...,FN})需要进行覆盖测试,每个特性都被评估了对应的优先级,特性使用其ID作为下标进行标识。 设计了M个测试用例({T1,T2,...,TM}),每个用例对应了一个覆盖特…

网络工程师笔记9

动态路由 RIP路由协议 配置简单 易于维护 适用于小型网络 周期性是30s发一次

分享关于如何解决系统设计问题的逐步框架

公司广泛采用系统设计面试,因为在这些面试中测试的沟通和解决问题的技能与软件工程师日常工作所需的技能相似。面试官的评估基于她如何分析一个模糊的问题以及如何逐步解决问题。测试的能力还包括她如何解释这个想法,与他人讨论,以及评估和优…

主网NFT的发布合约

1.什么是nft? NFT:Non-fungible-token 非同质化货币 2.新建suimove项目 使用sui move new 项目名命令新建sui move项目 sui move new nft_qyx项目结构如下: 3.写nft合约 module qyx123::nft{use sui::object::{Self, UID};use sui::transfer;use sui::tx_context::{Sel…

C++11_右值引用与移动语义

目录 1、左值的定义 1.1 左值引用 2、右值的定义 2.1 右值引用 3、右值与左值的使用区别 4、右值引用的意义 4.1 左值引用的短板 5、移动语义 5.1 移动构造 5.2 移动赋值 6、万能引用 6.1 右值的别名-左值化 6.2 完美转发 前言: 在C11之前就有了引…

143.和弦是什么?和声是什么?三和弦

内容参考于: 三分钟音乐社 上一个内容:142.音程的构唱练习 和弦的定义: 一个音可以把它称为单音 两个音可以把它称为音程 更多的音,通俗的定义上,三个音或者三个以上的音构成的集体就可以叫做和弦,这些音…

如何将虚拟机设置成固定IP

问题描述: 在VMware虚拟机上部署的项目ip地址和数据库ip地址发生变动,导致mysql,nginx,redis等无法访问,要改配置又特别麻烦,而且下次可能还会变动。 解决方法: 将虚拟机ip地址配置成固定ip 关闭虚拟机,找…

【SpringMVC】快速体验 SpringMVC接收数据 第一期

文章目录 一、SpringMVC 介绍1.1 主要作用1.2 核心组件和调用流程理解 二、快速体验三、SpringMVC接收数据3.1 访问路径设置3.1.1 精准路径匹配3.1.2 模糊路径匹配3.1.3 类和方法级别区别3.1.4 附带请求方式限制3.1.5 进阶注解 与 常见配置问题 3.2 接收参数(重点&a…

Vulnhub内网渗透Jangow01靶场通关

详细请见个人博客 靶场下载地址。 下载下来后是 .vmdk 格式,vm直接导入。 M1请使用UTM进行搭建,教程见此。该靶场可能出现网络问题,解决方案见此 信息搜集 arp-scan -l # 主机发现ip为 192.168.168.15 nmap -sV -A -p- 192.168.168.15 # 端…

python的虚拟环境

python的虚拟环境可以为项目创建一个独立的环境,能够解决使用不同版本依赖给项目带来冲突的麻烦。创建虚拟环境的方式有很多种,pipenv会自动帮你管理虚拟环境和依赖文件,并且提供了一系列命令和选项来帮忙你实现各种依赖和环境管理相关的操作…

【动态规划.3】[IOI1994]数字三角形 Number Triangles

题目 https://www.luogu.com.cn/problem/P1216 观察下面的数字金字塔。 写一个程序来查找从最高点到底部任意处结束的路径,使路径经过数字的和最大。每一步可以走到左下方的点也可以到达右下方的点。 7→3→8→7→5 的路径产生了最大权值。 分析 这是一个动态规划…

VMware虚拟机

1、虚拟机介绍 虚拟机(Virtual Machine)是一种软件,可以用来模拟具有完整硬件功能的完整的计算机系统的软件,并且可以和主机环境隔离开,互不影响。也就是,在实体计算机中能够完成的工作都可以通过虚拟机实…

哨兵系列数据下载(哨兵2号Sentinel-2下载)

目录 一、介绍 二、哨兵二号介绍 三、数据下载 1、注册账号 2、数据下载 3、相关问题 四、数据预处理 1、大气校正 2、重采样 五、其他问题 一、介绍 哨兵-1卫星是全天时、全天候雷达成像任务,用于陆地和海洋观测,首颗哨兵&#xf…

Python PyQt5 多Tab demo

参考: https://cloud.tencent.com/developer/news/388937 importsysfromPyQt5.QtWidgetsimportQVBoxLayout,QWidget,QFormLayout,QHBoxLayout,QLineEdit,QRadioButton,QCheckBox,QLabel,QGroupBox,QApplication,QTabWidgetclassTabDemo(QTabWidget):def__init__(se…

并查集(蓝桥杯 C++ 题目 代码 注解)

目录 介绍: 模板: 题目一(合根植物): 代码: 题目二(蓝桥幼儿园): 代码: 题目三(小猪存钱罐): 代码: …

OpenCASCADE+Qt创建建模平台

1、建模平台效果 2、三维控件OCCWidget 将V3d_View视图与控件句柄绑定即可实现3d视图嵌入Qt中&#xff0c;为了方便也可以基于QOpenGLWidget控件进行封装&#xff0c;方便嵌入各种窗体使用并自由缩放。 #ifndef OCCTWIDGET_H #define OCCTWIDGET_H#include <QWidget> #i…