您现在的位置是:首页 > 正文

深入理解JVM 一GC(下) G1 Garbage Collector

2024-01-30 20:22:46阅读 2

关于java程序性能

当我们调优java程序时,通常的目标有两个:
响应能力 或者 吞吐量

响应能力

响应能力指一个程序或者系统对请求的是否能够及时响应。
比如:
一个桌面UI能多快的响应一个事件;
一个网站能够多快返回一个页面请求;
数据库能够多快返回查询的数据;

对于这类对响应能力敏感的场景,长时间的停顿是无法接受的。

吞吐量

吞吐量关注的是,在一个指定的时间内,最大化一个应用的工作量。
如下方式来衡量一个系统吞吐量的好坏:

在一小时内同一个事务(或者任务、请求)完成的次数(tps)。
数据库一小时可以完成多少次查询;

对于关注吞吐量的系统,卡顿是可以接受的,因为这个系统关注长时间的大量任务的执行能力,单次快速的响应并不值得考虑。

应用程序运行实际/实际时间(开始时间戳-结束时间戳)

understanding TPS

G1 Garbage Collector

G1垃圾收集器

g1收集器是一个面向服务端的垃圾收收集器,适用于多核处理器、大内存容量的服务端系统。
它满足短时间gc 停顿的同时达到一个高的吞吐量。JDK7以上版本适用。

g1收集器的设计目标:

与应用线程同时工作,几乎不需要stop-the-world(与CMS类似);
整理剩余空间,不产生内存碎片;(CMS只能在full-GC时,用stop-the-world整理碎片内存)
GC停顿更加可控;
不牺牲系统的吞吐量;
gc不要求额外的内存空间(CMS需要预留空间存储浮动垃圾);

G1的设计规划,是要替换掉CMS。

G1在某些方便弥补了CMS的不足,比如,CMS使用的是mark-sweep算法,自然会产生内存碎片;然而G1基于copying算法,高效的整理剩余内存,而不需要使用free-list去管理内存碎片。
另外,G1提供了更多手段,以达到对gc停顿时间可控。

之前的GC收集器对Heap的划分:

这里写图片描述

G1对Heap的划分:

这里写图片描述

heap被划分为一个个相等的不连续的内存区域(regions),每个region都有一个分代的角色:eden、survivor、old(old还有一种细分 humongous,用来存放大小超过 region 50%以上的巨型对象)。

但是对每个角色的数量并没有强制的限定,也就是说对每种分代内存的大小,可以动态变化(默认年轻代占整个heap的5%)。

G1最大的特点就是高效的执行回收,优先去执行那些大量对象可回收的区域(region)。

另外,G1使用了gc停顿可预测的模型,来满足用户设定的gc停顿时间,根据用户设定的目标时间,g1会自动的选择哪些region要清楚,一次清除多少个region。

G1从多个region中复制存活的对象,然后集中放入一个region中,同时整理、清除内存(copying收集算法)。

注意对比之前的垃圾收集器(主要是CMS):
对比使用mark-sweep的CMS,g1使用的copying算法不会造成内存碎片
对比ParallelScavenge(基于copying )、ParallelOld收集器(基于mark-compact-sweep),Parallel
会对整个区域做整理导致gc Pause会比较长,而g1只是特定的整理几个region。

值得注意:g1不是一个实时的收集器,与parallelScavenge一样,对gc 停顿时间的设置并不绝对生效,只是g1有较高的几率保证不超过设定gc停顿时间。与之前的gc收集器对比,g1会根据用户设定的gc停顿时间,智能评估一下哪几个region需要被回收可以满足用户设定。

G1内存的分配

1.TLAB(TLAB占用年轻代内存). 默认使用TLAB加速内存分配,之前文章已经讲过,不赘述。
2.Eden.如果TLAB不够用,则在Eden中分配内存生成对象。
3.Humongous.如果对象需要的内存超过一个region的50%以上,会忽略前两个步骤直接在老年代的humongous中分配(连续的Region)。

何时使用G1(-XX:+UseG1GC)

1.大内存中为了达到低gc延迟.
比如:heap size >=6G,gc pause <=0.5s
2.FullGC时间太长,或者太频繁。

调优参数:
-XX:MaxGCPauseMillis=200
用户设定的最大gc 停顿时间,默认是200ms.
-XX:InitiatingHeapOccupancyPercent=45
默认是45,也就是heap中45%的容量被使用,则会触发concurrent gc。

G1垃圾回收步骤详解

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

G1 Young GC(STW)

1.当eden数据满了,则触发g1 YGC
2.并行的执行:
YGC 将 eden region 中存活的对象拷贝到survivor,或者直接晋升到Old Region中;将Survivor Regin中存活的对象拷贝到新的Survivor或者晋升old region。
3.计算下一次YGC eden、Survivor的尺寸

G1 Mix GC

在G1 GC中,它主要是为Mixed GC提供标记服务的,并不是一次GC过程的一个必须环节。global concurrent marking的执行过程分为五个步骤:

初始标记(initial mark,STW)
在此阶段,G1 GC 对根进行标记。该阶段与常规的 (STW) 年轻代垃圾回收密切相关。

根区域扫描(root region scan)
G1 GC 在初始标记的存活区扫描对老年代的引用,并标记被引用的对象。该阶段与应用程序(非 STW)同时运行,并且只有完成该阶段后,才能开始下一次 STW 年轻代垃圾回收。

并发标记(Concurrent Marking)
G1 GC 在整个堆中查找可访问的(存活的)对象。该阶段与应用程序同时运行,可以被 STW 年轻代垃圾回收中断

最终标记(Remark,STW)
该阶段是 STW 回收,帮助完成标记周期。G1 GC 清空 SATB 缓冲区,跟踪未被访问的存活对象,并执行引用处理。

清除垃圾(Cleanup,STW)
在这个最后阶段,G1 GC 执行统计和 RSet 净化的 STW 操作。在统计期间,G1 GC 会识别完全空闲的区域和可供进行混合垃圾回收的区域。清理阶段在将空白区域重置并返回到空闲列表时为部分并发。

g1 对老年代回收-总结:

1.并发标记阶段(Concurrent Marking Phase):
在不产生stop-the-world,与程序进程并发的情况下,活跃度(可达性分析)被分析出来。
活跃度越低,代表回收的效率越高,越值得优先回收。
2.复制、清理阶段(Copying/Cleanup Phase)
年轻代、老年代在这个阶段同时被回收掉。老年代被回收的region,是根据这个region的存活度来选择的。

更多详细信息请点击

网站文章

  • 【Linux】系统调用文件操作

    【Linux】系统调用文件操作

    Linux系统没有文本和二进制之分,所有的东西都是文件,文件描述符是一个整形数字,储存在PCB的文件描述符表中(一个数组)

    2024-01-30 20:22:19
  • linux用户管理常用命令

    主题:linux用户管理常用命令 1)管理用户(user)的工具或命令; useradd 注:添加用户 adduser 注:添加用户 passwd 注:为用户设置密码 usermod 注:修改用户命令,可以通过usermod 来修改登录名、用户的家目录等等; pwcov 注:同步用户从/etc/passwd 到/etc/shadow pwck 注:pwck是校验用户配置文件/etc/passwd

    2024-01-30 20:22:12
  • npm 下载包失败解决方案

    npm 下载包失败解决方案

    npm下载依赖包失败解决方案

    2024-01-30 20:22:04
  • flink归纳总结

    1.14 Flink1 简单介绍一下 FlinkFlink 是一个框架和分布式处理引擎,用于对无界和有界数据流进行有状态计算。并且 Flink 提供了数据分布、容错机制以及资源管理等核心功能。Flin...

    2024-01-30 20:21:58
  • Spring Cache详解

    从3.1开始,Spring引入了对Cache的支持。其使用方法和原理都类似于Spring对事务管理的支持。Spring Cache是作用在方法上的,其核心思想是这样的:当调用一个缓存方法时会把该方法参...

    2024-01-30 20:21:28
  • SparkStreaming 介绍及 wordcount 案例

    SparkStreaming 介绍及 wordcount 案例

    一、介绍1、Spark Streaming 是什么?Spark Streaming 用于流式数据的处理。Spark Streaming 支持的数据输入源很多,例如:Kafka、Flume、Twitte...

    2024-01-30 20:21:21
  • 抽象工厂模式--实例分析

    应用场景 某手机操作系统可以根据用户不同的喜好在多种主题之间进行切换,随着主题的变化,系统中的字体、app图标、壁纸、锁屏壁纸等元素会随之发生变化。 使用抽象工厂模式设计手机主题库 创建元素接口 //...

    2024-01-30 20:21:14
  • “原来我的专业考不了公务员!” 要考公,你的专业能报什么?

    “原来我的专业考不了公务员!” 要考公,你的专业能报什么?

    #原来我的专业考不了公务员#也登上热搜,引发网友热议这里说的“考不了”并非不能考,而是专业能够选择的岗位很少。每到公务员考试报名选岗阶段,很多”公考冷门专业“的同学都非常抓狂,筛了半天愣是一个匹配专业...

    2024-01-30 20:20:44
  • GDB——GDB调试工具简介

    什么是GDB? GDB的常规应用 GDB的启动方式 什么是GDB? GDB是GNU开源组织发布的一个强大的UNIX下的程序调试工具。与Window下的IDE不同,GDB是纯命令行执行的,并没有图形界面方法。 问题:既然windows下有对用户友好的图形界面的调试工具了。那么为什么我们还需要回到命令行的模式呢? 如果我们是在UNIX平台下做软件,我们会发现基本...

    2024-01-30 20:20:37
  • 打卡:Java面试系列基础题(3)

    内部类与静态内部类的区别:普通内部类作为外部类一个成员而存在,在普通内部类中可以直接访问外部类属性,调用外部类的方法静态内部类是相对外部类独立存在的,静态内部类中无法直接访问外部类中变量,方法,如果要...

    2024-01-30 20:20:29