JVM G1

JVM原理及调优(6)——G1收集器及G1日志分析 系列文章规划: JVM基础(1)——内存模型 JVM基础(2)——内存管理 JVM基础(3)——编译机制 JVM基础(4)——类加载机制 JVM基础(5)——垃圾回收和调优 JVM基础(6)——G1收集器及G1日志分析 JVM基础(7)——jdk常用内置工具 1 G1简介 1.1 概述 G1 (Garbage-First)是一款面向服务器的垃圾收集器,主要针对配备多核处理器及大... 阅读详情

JVM垃圾收集器发展历程

  • 第一阶段,Serial(串行)收集器

    在jdk1.3.1之前,java虚拟机仅仅能使用Serial收集器。 Serial收集器是一个单线程的收集器,但它的“单线程”的意义并不仅仅是说明它只会使用一个CPU或一条收集线程去完成垃圾收集工作,更重要的是在它进行垃圾收集时,必须暂停其他所有的工作线程,直到它收集结束。

  • 第二阶段,Parallel(并行)收集器

    Parallel收集器也称吞吐量收集器,相比Serial收集器,Parallel最主要的优势在于使用多线程去完成垃圾清理工作,这样可以充分利用多核的特性,大幅降低gc时间。

  • 第三阶段,CMS(并发)收集器

    CMS收集器在Minor GC时会暂停所有的应用线程,并以多线程的方式进行垃圾回收。在Full GC时不再暂停应用线程,而是使用若干个后台线程定期的对老年代空间进行扫描,及时回收其中不再使用的对象。

  • 第四阶段,G1(并发)收集器

    G1收集器(或者垃圾优先收集器)的设计初衷是为了尽量缩短处理超大堆(大于4GB)时产生的停顿。相对于CMS的优势而言是内存碎片的产生率大大降低。

JVM垃圾收集器种类

  • 1.新生代

    Serial (第一代)
    PraNew (第二代)
    Parallel Scavenge (第三代)
    G1收集器(第四代)

  • 2.老年代

    Serial Old (第一代)
    Parallel Old (第二代)
    CMS (第三代)
    G1收集器 (第四代)

G1收集器概述

  • 1.G1收集器的最大特点:
    G1收集器最大的特点是引入了分区的思路,弱化了分代的概念。
    合理利用垃圾收集各个周期的资源,解决了其他收集器甚至CMS的众多缺陷。

  • 2.G1相比较CMS的改进
    算法:G1基于标记-整理算法,不会产生空间碎片,分配大对象时不会无法得到连续的空间而提前触发一次FULL GC。
    停顿时间可控:G1可以通过设置预期停顿时间(Pause Time)来控制垃圾收集时间避免应应用雪崩现象。
    并行与并发:G1能更充分的利用CPU,多核环境下的硬件优势来缩短stop the world的停顿时间。

  • 3.CMS和G1的区别
    CMS中,堆被分为PermGen,YoungGen,OldGen;而YoungGen又分了两个survivo区域。在G1中,堆被平均分成几个区域(region),在每个区域中,虽然也保留了新老代的概念,但是收集器是以整个区域为单位收集的。
    G1在回收内存后会马上同时做合并空闲内存的工作、而CMS默认是在STW(stop the world)的时候做。
    G1会在Young GC中使用、而CMS只能在O区使用。

G1收集器的应用场景

1.8之前,JVM分为新生代、老年代、持久代。1.8之后,元空间取代了持久代。

  • G1收集器的内存模型
    在这里插入图片描述

  • G1堆内存结构
    堆内存会被切分成为很多固定大小的区域(region),每个是连续范围的虚拟内存。
    堆内存中一个区域(region)的大小可以通过-XX:G1HeapRegionSize参数指定,大小区间最小1M,最大32M,总之是2的幂次方。
    默认把堆内存分为2048份。

  • G1堆内存分配
    每个Region被标记了E,S,O,H,这些区域在逻辑上被映射为Eden,Survivor和老年代。
    存活的对象从一个区域转移(即复制或移动)到另一个区域。区域被设计为并行收集垃圾,可能会暂停所有应用线程。
    如上图所示,区域可以分配到Eden,survivor和老年代。此外,还有第四种类型,被称为巨型区域(Humongous Region)。Humongous区域是为了那些存储超过50%标准region大小的对象而设计的,它用来专门存放巨型对象。如果一个H区装不下一个巨型对象,那么G1会寻找连续的H分区来存储。为了能找到连续的H区,有时候不得不启用Full GC。

G1回收流程

  • G1收集器的阶段分以下几个步骤
    在这里插入图片描述
    1)G1执行的第一阶段:初始标记(Initial Marking)
    这个阶段是STW(stop the world)的,所有应用线程会被暂停,标记出从GC Root开始直接可达的对象。
    2)G1执行的第二个阶段:并发标记
    从GC Roots开始对堆中对象进行可达性分析,找出存活对象,耗时较长。当并发标记完成后,开始最终标记(Final Marking)阶段
    3)最终标记(标记那些在并发标记阶段发生变化的对象,将被回收)
    4)筛选回收(首先对各个Region的回收价值和成本进行排序,根据用户所期待的GC停顿时间指定回收计划,回收一部分Region)
    最后,G1中提供了两种模式垃圾回收模式,Young GC和Mixed GC,两种都是Stop The World(STW)的。

G1的GC模式

  • Young GC年轻代收集
    在分配一般对象(非巨型对象)时,当所有eden region 使用达到最大阈值并且无法申请足够内存时,会触发一次YoungGC。每次younggc会回收所有Eden以及Survivor区,并且将存活对象复制到Old区以及另一部分的Survivor区。

    Young GC的回收过程如下:
    跟扫描,跟CMS类似,Stop the world,扫描GC Roots对象。
    处理Dirty card,更新RSet.
    扫描RSet,扫描RSet中所有old区对扫描到的young区或者survivor去的引用。
    拷贝扫描出的存活的对象到survivor2/old区
    处理引用队列,软引用,弱引用,虚引用

    Mixed GC
    当越来越多的对象晋升到老年代old region时,为了避免内存被耗尽,虚拟机会触发一个混合的垃圾收集器,即mixed gc,该算法并不适宜个old gc,除了回收整个young region,还会回收一部分的old region,这里需要注意:是一部分老年代,而不是全部老年代,可以选择那些old region进行收集,从而可以对了垃圾回收的耗时时间进行控制。
    G1没有full GC的概念,需要full GC时,调用serialOldGC进行全堆扫描(包括eden、survivor、o、perm)。

G1的推荐应用

  • G1的第一个重要特点是为用户的应用程序的提供一个低GC延时和大内存GC的解决方案。这意味着堆大小6GB或者更大,稳定和可预测的暂停时间将低于0.5秒。
  • 如果应用程序使用CMS或ParallelOld垃圾回收器具有一个或多个一下特征,将有利于切换到G1:
    Full GC持续时间太长或太频繁
    对象分配率或年轻代升级老年代很频繁
    不期望的很长的垃圾收集时间或压缩暂停(超过0.5至1秒)

注意:如果你正在使用CMS或ParallelOld收集器,并且你的应用程序没有遇到长时间的垃圾收集暂停,则保持与您的当前收集器是很好的,升级JDK并不必要更新收集器为G1。

JVM G1源码分析和调优书 阅读笔记 二 第3章 G1的对象分配 线程的私有缓冲区,不是线程栈空间 TLAB 过小会导致不停地分配新的TLAB,如果TLAB 过大,会导致内存碎片问题。 JVM 提供了参数TLABSize来控制TLAB的大小,JVM会自己推断这个值多大更合适,设置TLAB占用Eden空间的百分比 ... 阅读详情

相关推荐

JVM G1源码分析和调优书 阅读笔记 第7章 Full GC

对象分配失败,就会进入到Evac失败过程,在GC日志详情中会打印相关信息 1.处理失败 2.再次尝试分配,仍然不成功,进行Full GC 7.1 Evac失败 把对象放入到Evac失败栈;直接更新对象的RSet,不需要对已复制的对象做额外回收之类的处理 检查是否有指向自己的指针,如果有,就代表发生了复制失败。需要删除指针,恢复对象头 1. 把这个分配失败的对象,放入到特殊的d...

郭传志的博客 536

JVM 源码分析06

JVM源码分析之堆内存的初始化 堆初始化 Java堆的初始化入口位于Universe::initialize_heap方法中,实现如下: 其中UseParallelGC、UseG1GC、UseConcMarkSweepGC都可以通过启动参数进行设置,整个初始化过程分成三步: 1、初始化GC策略; 2、初始化分代生成器; 3、初始化Java堆管理器; GC策略初始化 HotSpot...

郭传志的博客 263

JVM G1源码分析和调优书 阅读笔记 五 第6章 混合回收

6.1 并发标记算法 用Prev指针指向上一次并发处理后的地址,用Next指向并发标记开始之前内存已经分配成功的地址。 并发标记结束后,只需要把Prev指针设置为Next指针,即可开始新一轮的标记处理。 并发标记引入两个位图 PrevBitMap 和 NextBitMap ,来指示哪块内存已经使用,哪块未使用 PrevBitMap 记录prev指针之前内存...

郭传志的博客 309

JVM G1源码分析和调优书 阅读笔记 第10章 && 第11 章

为了实现STW,JVM设计了安全点 10.2 G1 并发线程进入安全点 G1新引入的线程都是自己主动让出CPU进入暂停 用join判断VMThread是否发出了进入安全点的请求,如果VMThread发出了请求,则并发线程在此等待。 leave 发现VMThread 发出进入安全点的请求后,通知VMThread检查是否需要继续等待,因为...

郭传志的博客 485

JVM性能调优实践——G1 垃圾收集器介绍篇

前言 前面两篇主要整理了性能测试的主要观察指标信息:性能测试篇,以及JVM性能调优的工具:JVM篇。这一篇先简单总结一下GC的种类,然后侧重总结下G1(Garbage-First)垃圾收集器的分代,结合open-jdk源码分析下重要算法如SATP,重要存储结构如CSet、RSet、TLAB、PLAB、Card Table等。最后会再梳理下G1 GC的YoungGC,MixedGC收集过程。 ...

马猴烧酒└(┐卍^o^)卍ドゥルルル~楪詩月「YUZURIHA SHIZUKI」 2万+

JVM 的GC回收算法----G1

JVM内存垃圾回收目前有多种算法,每种算法都有自己的特点和使用场景,本文主要介绍一下G1(Garbage-First)算法.G1是一款面向服务端应用的垃圾回收器,是SUN公司在JDK1.7中提出来的,初衷是替换JDK1.5中的CMS垃圾回收算法。G1之前的所有收集器都是对整个新生代或老年代进行垃圾回收,而G1不是这样:G1是将整个堆空间分成许多个大小不等的独立区域(Region),大约有2...

jerry_player的博客 4193

JVM G1性能调优

G1整体上保持默认配置即可,最多配置一下 pause-time goal或堆内存大小(和)。不像其他的垃圾回收器,G1默认已经在最大吞吐和低时延之间做了平衡。但是,G1在堆中的增量式空间回收和pause-time控制机制给应用线程和回收效率上都带来了负担。如果需要大吞吐(非在线业务,如后台任务),可以适当调大期望最大停顿时间() 或者调大堆空间。如果需要低时延(在线业务),可以调小最大停顿时间。不要配置,等

weixin_41866717的博客 1638

JVM g1 部分参数

g1 部分参数 配置项 意义 -XX:CICompilerCount=3 JVM最大并行编译线程数 -XX:ConcGCThreads=1 GC并发阶段使用的线程数 -XX:+DisableExplicitGC 禁止代码中显示调用GC -XX:G1HeapRegionSize=8388608 单位byte,此处是8M,设置的 G1 区域的大小。值是 2 的幂,范围是 1 MB 到 32 MB 之间。目标是根据最小的 Java 堆大小划分出约 2048 个区域。每个Region的状

1644

【JVM】JVM内存结构之——G1收集器

目录1. 什么是G12. G1收集器发展历程3. G1收集器分区划分3.1 为什么G1收集器需要设计巨型对象3.2 G1收集器参数设置3.3 G1收集器回收的细节3.4 G1收集器Rset问题(记忆集)3.5 G1两种回收策略4. G1收集器优缺点5. G1收集器核心配置参数 1. 什么是G1 G1收集器(Garbage-First Garbage Collector) 整堆收集。 G1收集器是一款在server端运行的垃圾收集器,专门针对于拥有多核处理器和大内存的机器,在JDK 7u4版本发行时被正式

记录各种Bug解决案例及日常学习内容 6569

深入剖析JVM及G1垃圾回收器

Java开发工具包(JDK)内置了多个用于性能监控的工具,如jstat、jmap、jstack、jconsole和VisualVM等。这些工具提供了不同层次的监控能力:jstat: 用于监控JVM的统计信息,包括类加载、垃圾收集、即时编译情况等。jmap: 用于获取内存映射文件或堆内存的快照。jstack: 用于生成JVM当前时刻的线程快照。jconsole: 提供了一个图形化的监控界面,可以查看JVM的内存使用情况、线程状态等。VisualVM。

weixin_32836713的博客 790

PCIe Crosslink

PCIe Crosslink(交叉连接)是一种特殊的PCIe链路连接方式,允许两个PCIe设备(通常是Root Complex或Endpoint)是指两个PCIe设备(如两个CPU、两个FPGA或两个GPU)通过PCIe链路直接连接,形成点对点(P2P)通信通道。:两个Intel/AMD CPU通过PCIe Crosslink直接通信(替代UPI/Infinity Fabric)。:主板需提供PCIe Crosslink连接(如特定插槽支持x16/x8 Crosslink)。

zly8865372的博客 1636

JVM实用参数-G1收集器

1.gc参数配置: -XX:+UseG1GC 使用G1垃圾收集器 -XX:MaxGCPauseMillis=200 设置期望达到的最大GC停顿时间指标(JVM会尽力实现,但不保证达到) -XX:InitiatingHeapOccupancyPercent=45 启动并发GC周期时...

dcm19920115的博客 2165

深入解析iDP3的Learning模块:从数据集构建到3D动作预测的代码实现

本文深入解析iDP3框架的Learning模块,从数据集构建到3D动作预测的完整代码实现。通过扩散模型实现视觉输入到动作序列的端到端预测,详细介绍数据采集、增强策略、模型架构及训练技巧,帮助开发者掌握3D动作预测策略的核心技术。

k0l1m2n3o的博客 310

JVM—G1笔记

1.JVM调优的两个指标:吞吐量,停顿时间 停顿时间:简单理解为STW的时间,此时用户代码不会执行。 吞吐量:运行用户代码时间/(运行用户代码时间 + 运行垃圾收集器的时间) 这两者是矛盾的,选择了停顿时间意味着要牺牲了吞吐量,选择了吞吐量意味着要牺牲停顿时间。根据具体的业务场景,选择优先停顿时间还是优先吞吐量。 2.G1的参数设置: -XX:+UseG1GC 开启G1 -Xms2G -Xmx2G 设置堆的大小,G1一半不需要手动设置eden和survivor的大小,G1自己动态调整 -Xss

chenkaibsw的专栏 752

对于基本的捕鱼游戏设计思路(五)——鱼

今天讲捕鱼游戏里鱼的部分,也是比较关键的一部分。 一步一步来,先分析游戏,首先鱼是从屏幕外生成,然后它有个移动的动作,而且分为不同的类型。 然后就可以进入代码部分,首先设置一个计时器,控制时间生成鱼,而鱼分种类,所以就用到随机函数,随机输出一个值,传入switch语句,从而生成不同的鱼。 void GameScene::xiaoyuupdate(float dt){ Size visibl

Cineze的博客 1万+

生成式深度学习(第二版)-第一章-Conda环境下TensorFlow和Keras的安装和配置

按照书籍中的代码运行提示,需要配置Docker。个人的机器上正好有 conda4.14.0,索性就在本地环境进行配置。

GarryWang1248的博客 398

jvm内存配置参数_JVM之G1回收器和常见参数配置

过去的几天里,我把JVM内部的垃圾回收算法和垃圾回收器。还剩下最后一个G1回收器没有说,我们今天数一下G1回收器和常见的参数配置。G1回收器G1 (Garbage-First)是一款面向服务器的垃圾收集器,主要针对配备多颗处理器及大容量内存的机器,以极高概率满足GC停顿时间要求的同时,还具备高吞吐量性能特征。我们会想一下我们上次课说的parNew+CMS回收器已经很厉害了,但是我们的服务器是那种超...

weixin_39747399的博客 2904

(秋招复习)一些SLAM基础

秋招复习--SLAM基础知识篇

weixin_45432823的博客 767

深入JVM:详解G1垃圾回收器原理

本文小豪将带大家认识各类垃圾回收器的基础概念与应用场景,同时重点讲解目前最为流行的G1垃圾回收器的工作原理。G1采用独特的内存管理策略,实现对整个堆空间的垃圾回收,主要将堆内存划分为多个大小相等的区域(称为Region),各个区域根据需要扮演不同的角色。G1垃圾回收器年轻代回收时,采用了三种关键技术,分别是记忆集、卡表和写屏障。

Code豪客 1万+

LVGL 丝滑菜单3(Silk Menu)

h。

摸鱼专家 89

泛微OA集成阿里云短信(E9保姆教程)

泛微OA集成阿里云短信(E9保姆教程)

技术分享 515

JVM Optimization Learning(五)-G1

humongous:/hjuːˈmʌŋɡəs/ 巨大的、庞大的。压缩空闲空间不会延长GC的暂停时间。适用不需要实现很高的吞吐量的场景。更易预测的GC暂停时间。

杀神lwz的博客 1283

勇闯dify v1.0.0之设置模型供应商。解决:Reached maximum retries (3) for URL https://marketplace.dify.ai/

朋友们,大家好,今天带大家来勇闯dify v1.0.0。为什么叫勇闯呢?我就这么说吧,本来我昨天就想带大家勇闯v1.0.0的。但是dify的marketplace访问不了。公司的网和手机热点都试了,就是访问不了。我们连个模型都没有,还勇闯个球啊,对吧,就搁置了。今天,我赶紧看看这个marketplace好了没。一看,可以了。赶紧写下这篇博客,帮助同志们走出困境。

xiezhipu的博客 4616

JVM垃圾收集器G1&ZGC

G1 (Garbage-First)是一款面向服务器的垃圾收集器,主要针对配备的机器. 以极高概率满足GC停顿时间要求的同时,还具备高吞吐量性能特征.

qinwenjng120的博客 1001

jre9下载 jdk9

(Java SE Runtime Environment 9.0) 9.0u175 官方最新版 【x86|x64】

WINCC7.3破解文件

WINCC7.3硬件够破解文件,有需要的下载!WINCC7.3硬件够破解文件,有需要的下载!

JVM里面比较常问到的CMS和G1

1.JVM垃圾收集器 JVM在历史长河里面出现了很多的垃圾收集器,咱们总结一下 新生代收集器:Serial、ParNew、Parallel Scavenge 老年代收集器:CMS、Serial Old、Parallel Old 整堆收集器: G1 在后面就是ZGC了。 Serial和Serial Old是串行的垃圾回收器,一般是在早期内存比较小的时候才会使用到的。 Parallel Scavenge、Parallel Old是并行的垃圾收集器,也就是所谓的PS+PO,目前好多公司没有优化的时候

王二小的博客 2870

怀旧版电脑GBC模拟器

再现原版GBC掌机的界面,电脑运行连游戏界面都一样大小,很怀旧,很真实,(英文版)强烈推荐,很小的文件,很难才找到的。

JVM的CMS、G1以及ZGC对比

在架构设计中,我们可以考虑将系统划分为多个模块或微服务,每个模块或微服务承担不同的职责,通过模块间的协作来实现整个系统的功能。G1(Garbage-First)垃圾回收器,如同一位全能战士,采用了分而治之的策略,将整个堆内存划分为多个大小相等的区域(Region),并根据每个区域的垃圾量来决定回收的优先级。:尽管ZGC在JDK 15中已经从实验性状态毕业,成为正式支持的垃圾收集器,但在某些环境或应用程序中,由于其较新的特性和可能的未完全优化的行为,一些用户可能仍然对其持谨慎态度。

guangzhi0633的专栏 1759

Statistics and Machine Learning Toolbox

Statistics and Machine Learning Toolbox(带书签),MATLAB统计学习工具

上一篇: spark自定义累加器
下一篇: spark自定义外部数据源
caixiaohao007
博客等级 码龄10年 1粉丝 6原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值