学习
实践
活动
工具
TVP
写文章

Java G1学习笔记

初衷 在G1提出之前,经典的垃圾收集器主要有三种类型:串行收集器、并行收集器和并发标记清除收集器,这三种收集器分别可以是满足Java应用三种不同的需求:内存占用及并发开销最小化、应用吞吐量最大化和应用GC G1设计了一个标记阈值,它描述的是总体Java堆大小的百分比,默认值是45,这个值可以通过命令-XX:InitiatingHeapOccupancyPercent(IHOP)来调整,一旦达到这个阈值就回触发一次并发收集周期 增加或减少这个值,请确保对总的 Java 堆调整相同的量 10 -XX:G1HeapRegionSize=n 分区的大小 堆内存大小的1/2000,单位是MB,值是2的幂,范围是1MB到32MB之间 - Garbage-First Garbage Collector 《Java性能权威指南》 《Java性能调优指南》 G1入门,O记官网的PPT Java Hotspot G1 GC的一些关键技术 G1 GC的论文 R大关于G1 GC的帖子 Tips for Tuning the Garbage First Garbage Collector Java性能调优指南 Java性能权威指南 G1: What

77210

Java 新型垃圾回收器(Garbage First,G1)

G1目标 G1 is planned as the long term replacement for the Concurrent Mark-Sweep Collector. 计划将G1作为CMS收集器的长久替代物。 它是为了平衡 延时和吞吐量之间的一种最优关系。 基本概念 G1 堆布局 G1将堆分成若干固定大小的Region/区域(区域大小只有1、2、4、8、16和32M),G1的新生代和老年代都是一个无需连续的区域集合,每一个区域独立进行内存的分配和回收,区域是内存管理的基本单元 这个阶段由多个混合的收集动作组成,不仅包含新生代区域,同时也会排除老年代区域的存活对象,当G1发觉依然无法满足空闲的空间请求时,G1会终止本阶段。 G1 Vs. 传统垃圾回收器 G1 不区分新/老生代,只区分Region G1 收集分2个阶段Young-only 和Space-reclamation

33220
  • 广告
    关闭

    2022腾讯全球数字生态大会

    11月30-12月1日,邀您一起“数实创新,产业共进”!

  • 您找到你想要的搜索结果了吗?
    是的
    没有找到

    JVM进阶(十一):JAVA G1收集器

    同优秀的CMS垃圾回收器一样,G1也是关注最小时延的垃圾回收器,也同样适合大尺寸堆内存的垃圾收集,官方也推荐使用G1来代替选择CMS。 先讲讲G1收集器的特点,G1收集器也是个多线程的收集器,能够充分利用多个CPU进行工作,收集方式也与CMS收集器类似,因此不会有太久的停顿。 虽然回收的范围是整个堆,但还是有分代回收的回收方式。 事实上,G1收集器与串行收集器、并行收集器、并发标记清除收集器这三组收集器有很大不同: G1的设计原则是”首先收集尽可能多的垃圾(Garbage First)”。 由于都是以相等大小的分区为单位进行操作,因此G1天然就是一种压缩方案(局部压缩); G1虽然也是分代收集器,但整个内存分区不存在物理上的年轻代与老年代的区别,也不需要完全独立的survivor(to space G1只有逻辑上的分代概念,或者说每个分区都可能随G1的运行在不同代之间前后切换; G1的收集都是STW的,但年轻代和老年代的收集界限比较模糊,采用了混合(mixed)收集的方式。

    9210

    神奇的G1——Java全新垃圾回收机制

    G1全称是Garbage First Garbage Collector,使用G1的目的是简化性能优化的复杂性。例如,G1的主要输入参数是初始化和最大Java堆大小、最大GC中断时间。 因为G1的操作以Region为基础,因此它适用于大Java堆。即便Java堆很大,大量的GC工作可以被限制在小型Region集合里面。 G1允许用户指定停顿时间目标,G1通过自适应的堆大小来满足这个目标。 ※G1 GC深度原理 G1把整个Java堆划分为若干个区间(Regions)。 如果没有连续的可用Regions,G1会做一个Java heap的full gc去压缩对象。 G1通过将Heap划分为多个Region,可以让G1操作可以在一个Region里面执行而不是整个Java堆或者整个年代(Generation)。

    1.4K10

    Java虚拟机 G1 GC 调优解析

    在上篇文章中,我们解析了 Java 虚拟机体系生态中基于 CMS GC 策略的调优场景及基本案例,具体链接为:Java虚拟机 CMS GC 调优解析。 毕竟,Java 9 之后,G1 GC 已成为默认的 GC 算法。 毕竟,在 Java 8上,默认 GC 是 CMS GC,而在 Java 11 上,默认 GC 才是 G1 GC。 Java 8 的日志记录选项不能用于 Java11。 至此,关于 Java虚拟机 G1 GC 调优解析相关内容本文到此为止,大家有什么疑问、想法及建议,欢迎留言沟通。

    21420

    JVM - G1初探

    ---- G1的内存分区 ? G1Java堆内存划分为多个大小相等的独立区域(Region),JVM最多可以有2048个Region。 一般一个Region的大小 = 堆内存/2048 . G1在淡化分代理论上还不是很彻底, G1保留了年轻代和老年代的概念,但不再是物理隔阂了,它们是(可以不连续)Region的集合。 部分其他收集器原本需要停顿Java线程来执行GC动作,G1收集器仍然可以通过并发的方式让java程序继续执行。 可预测的停顿:这是G1相对于CMS的另一个大优势,降低停顿时间是G1 和 CMS 共同的关注点,但G1 除了追求低停顿外,还能建立可预测的停顿时间模型,能让使用者明确指定在一个长度为M毫秒的时间片段(通过参数 www.oracle.com/technetwork/tutorials/tutorials-1876574.html https://www.oracle.com/technical-resources/articles/java

    37830

    java9系列(九)Make G1 the Default Garbage Collector

    序 本文主要研究下JEP 248: Make G1 the Default Garbage Collector 默认垃圾收集器 java9废弃了CMS垃圾收集器,并把G1提升为默认垃圾收集器,替代了原来的吞吐优先的 目标是根据最小的Java堆大小划分出约2048 个区域. Humongous Object/ Humongous区域 对于G1 GC,任何超过区域一半大小的对象都被视为“巨型对象”。 默认值是Java堆的10% -XX:G1MixedGCCountTarget=8 设置标记周期完成后,对存活数据上限为 G1MixedGCLIveThresholdPercent 的旧区域执行混合垃圾回收的目标次数 增加或减少百分比时,请确保对总的Java 堆调整相同的量 避免使用-Xmn选项或-XX:NewRatio等其他相关选项显式设置年轻代大小,固定年轻代的大小会禁用掉暂停时间(MaxGCPauseMillis 深入理解 Java G1 垃圾收集器 Java 9中的GC调优基础 Java Hotspot G1 GC的一些关键技术 Garbage First G1收集器 理解和原理分析 Tuning Java Garbage

    47020

    CMS和G1

    G1收集器 Garbage First收集器,首次提出了局部收集的设计思路和基于Region的内存布局。 对于G1来说,其每次收集的区域不再是整个年轻代、老年代或者整个堆。 CMS和G1的比较 G1替换掉CMS已经成为不可逆转的趋势,下面就G1为何比CMS优秀加以说明: 1)G1基于Region的局部回收避免了全堆进行垃圾回收,再加上其按照动态受益确定回收集极大的提升了回收效率 2)G1总体上采用的是标记-整理算法,局部(region之间)采用的是标记-复制算法,与CMS的标记-清除算法相比,其不会产生内存碎片。 G1也存在他的缺点: G1的卡表所占的空间巨大,由于每个Region都要拥有一张卡表,如此导致记忆集要占20%左右的堆空间,而CMS中只需要维护老年代指向新生代的一张卡表即可。

    55031

    Java垃圾收集器之G1介绍(一)

    JVM主要组件包括,类加载器,运行时内存区,以及执行引擎,程序员主要关注的应该是运行时区域这块了, 回顾下类加载器的顺序: ->Boostrap ClassLoad 引导类,加载java规范定义和接口声明主要是 ClassLoad 加载class path环境内的jar -> (User Difine ClassLoad) //用户自定义的加载器 需要继承ClassLoad抽象类,重写其中的一些方法 在Java 垃圾收集器: 一:G1垃圾收集器介绍 G1垃圾收集器是服务端的垃圾回收器,它的应用目标主要是在多CPU和大内存的应用场景中,旨在大多数情况下,在可预测的垃圾回收时间内,获得更大的吞吐量为目标,G1 (3)可预测的GC停顿时间 (4)更高的吞吐量 (5)小内存的Java堆也可以用G1 G1收集器的长远目标旨在替代CMS垃圾收集器,当然现在G1还不太成熟,CMS垃圾收集器,仍是电商类,B/S网站类 G1的分配方式与之前的不同,如下图: ?

    59050

    Java Hotspot G1 GC的一些关键技术

    Do not require a much larger Java heap. 不需要更大的Java Heap。 G1收集器的设计目标是取代CMS收集器,它同CMS相比,在以下方面表现的更出色: G1是一个有整理内存过程的垃圾收集器,不会产生很多内存碎片。 ParallelGCThreadsSTW期间,并行GC线程数-XX:ConcGCThreads=n并发标记阶段,并行执行的线程数-XX:InitiatingHeapOccupancyPercent设置触发标记周期的 Java 这里的java堆占比指的是non_young_capacity_bytes,包括old+humongous GC日志 G1收集器的日志与其他收集器有很大不同,源于G1独立的体系架构和数据结构,下面这两段日志来源于美团点评的 30464K, reserved 1077248K class space used 3391K, capacity 3480K, committed 3584K, reserved 1048576K java

    32100

    通过 G1 GC Log 重新认识 G1 垃圾回收器

    引言 上一篇文章中,我们详细介绍了 CMS 的配置参数以及 gc log 的解读: JAVA 性能调优 -- 带你解读 CMS GC 日志 但事实上,g1 由于他的诸多优势已经越来越多的受到 java 此前,我们已经深入介绍了 g1 垃圾回收的机制以及相应的配置: 驾驭一切的垃圾收集器 -- G1 本文,我们就来详细介绍一下 g1 的 gc log,让你能够通过 g1 的 gc log 分析出性能问题出在哪里 G1TraceEagerReclaimHumongousObjects # 跟踪并输出超大对象回收相关信息 -XX:+G1ConcRegionFreeingVerbose # Debug JVM 3. gc 日志的自动分割 对于线上持续运行的 java G1 的 gc log 4.1 young gc 如图所示,相较于 CMS 的 GC 日志,G1 的 GC 日志信息更为详细。 4.4 FULL GC 在 G1 中,full gc 是我们要极力避免的,他是整个堆内存的完整收集,因此,G1 中的 full gc 通常意味着一个漫长的 stw 暂停。

    20620

    Java Hotspot G1 GC的一些关键技术

    Do not require a much larger Java heap. 不需要更大的Java Heap。 G1收集器的设计目标是取代CMS收集器,它同CMS相比,在以下方面表现的更出色: G1是一个有整理内存过程的垃圾收集器,不会产生很多内存碎片。 ParallelGCThreadsSTW期间,并行GC线程数-XX:ConcGCThreads=n并发标记阶段,并行执行的线程数-XX:InitiatingHeapOccupancyPercent设置触发标记周期的 Java 这里的java堆占比指的是non_young_capacity_bytes,包括old+humongous GC日志 G1收集器的日志与其他收集器有很大不同,源于G1独立的体系架构和数据结构,下面这两段日志来源于美团点评的 30464K, reserved 1077248K class space used 3391K, capacity 3480K, committed 3584K, reserved 1048576K java

    1K20

    Java HotSpot G1垃圾优先型垃圾回收器调优

    G1 GC是适用于 Java HotSpot VM 的低暂停、服务器风格的分代式垃圾回收器。G1 GC 使用并发和并行阶段实现其目标暂停时间,并保持良好的吞吐量。 现在,我们来看看如何针对评估、分析和性能来调整和调优 G1 GC。我们假定您对 Java 垃圾回收有基本的了解。 G1 GC 是区域化、分代式垃圾回收器,这意味着 Java 对象堆(堆)被划分成大小相同的若干区域。启动时,Java 虚拟机 (JVM) 会设置区域大小。 有关溢出和用尽的日志消息 当您在日志中看到目标空间溢出/用尽的消息时,意味着 G1 GC 没有足够的内存,供存活者和/或晋升对象使用。Java 堆不能扩展,因为已达到最大值。 G1 GC 的自适应特性使 JVM 命令行只需要软实时暂停时间目标的最大值以及 Java 堆大小的最大值和最小值,即可开始工作。

    70950

    Java Hotspot G1 GC的一些关键技术

    Do not require a much larger Java heap. 不需要更大的Java Heap。 G1收集器的设计目标是取代CMS收集器,它同CMS相比,在以下方面表现的更出色: G1是一个有整理内存过程的垃圾收集器,不会产生很多内存碎片。 G1 中几个重要概念 在G1的实现过程中,引入了一些新的概念,对于实现高吞吐、没有内存碎片、收集时间可控等功能起到了关键作用。下面我们就一起看一下G1中的这几个重要概念。 JavaThread::satb_mark_queue_set().is_active()) return; Thread* thr = Thread::current(); if (thr->is_Java_thread 相关文章: RDS平台介绍 Java 8 之重新认识HashMap Java 内存访问重排序的研究

    967100

    JVM g1 部分参数

    ConcGCThreads=1 GC并发阶段使用的线程数 -XX:+DisableExplicitGC 禁止代码中显示调用GC -XX:G1HeapRegionSize=8388608 单位byte,此处是8M,设置的 G1 目标是根据最小的 Java 堆大小划分出约 2048 个区域。 16G -XX:InitiatingHeapOccupancyPercent=30 设置触发标记周期的 Java

    65210

    入门G1垃圾回收器

    适当增加了部分内容 以下章节省略 Purpose、Time to Complete、Introduction、Hardware and Software Requirements、Prerequisites、Java Overview、Java Runtime Edition、Java Programming Language、Java Development Kit、Java Virtual Machine、Reviewing summary Hotspot架构 Hotspot JVM架构有着非常强大的特性和能力,能够支持做到高性能并且大规模可扩展,比如:Hotspot JVM的JIT 编译器会动态的做优化,换句话说,这些优化即在Java JIT编译器也会对性能产生很大的影响,只是一般是在更新版本的JVM中做调整 性能基础知识 一般讲到Java应用,主要关注两件事情:响应和吞吐量 响应 响应描述的是系统返回数据时快不快,比如: 桌面UI 它从JDK 7 update 4之后开始完全支持,它被设计成: 能像CMS收集器一样和应用线程并发的执行 空间紧凑,免去了冗长的GC暂停时间 GC暂停时间可预测 不想牺牲吞吐量 不需要更大的Java

    25120

    探索G1垃圾回收器

    今天我们继续探索垃圾回收器G1的原理,让我们开始吧! G1的内存模型 G1是从jdk7开始出现的,在jdk9中被设为默认垃圾收集器,目标就是彻底替换掉CMS,那么为什么它可以替换掉CMS呢? G1的停顿时间控制 除了内存的变化,G1还有一个最大的变化,就是可以让我们设置一个垃圾回收的预期停顿时间,也就是说我们可以指定G1垃圾回收导致“Stop the World”的最长时间。 引入G1后,我们可以自己去设定这个停顿的最长时间了,相当于直接控制了垃圾回收的性能。 G1要做到这一点就要去追踪每个Region的回收价值,那什么是回收价值呢?大家看下图: ? G1的垃圾回收详解 上文我们了解到新生代还是有eden和survivor的,那么随着新生代占据堆内存大小的60%的时候,这个时候就会触发新生代的GC,G1也会使用之前我们说过的复制算法进行垃圾回收,进入一个 总结 本文我们对G1的内存机制和垃圾回收的算法做了一个比较清晰的解释。 阅读完本文,相信小伙伴们自己可以总结出G1和CMS究竟有什么不一样了吧。

    90130

    G1收集器图解

    G1在堆上分配内存和其他的GC有点不一样。现在我们来一步一步看下G1系统。 1、 G1堆结构 G1的堆结构就是把一整块内存区域切分成多个固定大小的块。 2、 G1内存分配 事实上,这些region最后又被分别标记为Eden,Survivor和old。 记住一点:G1不是像老一辈的那些垃圾回收器一样要求每一代的块是连续的,在G1中可以不是连续的。 4、G1中的一次Young GC 存活的对象被转移到一个/或多个survivor 块上去。 6、G1的老年代垃圾收集 就像CMS收集器一样,G1也是一个暂停少的收集器。下面这个流程图就描述了G1在老年代的各个收集阶段。 一步步了解老年代垃圾收集 结合上面的流程图,我们来看看在G1收集器中他们是如何和老生代互动的。

    12720

    G1 GC简单优化技巧

    G1 GC是一种自适应垃圾收集算法,自Java 9以来已成为默认的GC算法。今天主要通过分享一些简单的技巧来调整G1垃圾收集器以获得最佳运行性能。 3、移除旧的参数 从其他GC算法(CMS,Parallel等)转移到G1 GC算法时,需要关注参数的适配性,有的参数搭配是不兼容的,故在实际的项目中,我们在进行Java虚拟机参数设置时,需检测及移除所有与旧 如果在Java 8 update 20及更高版本上运行,则可以考虑将此参数传递给应用程序。它有可能提高整体应用程序的性能。 Java 8以及之前的版本: -XX:+PrintGCDetails -XX:+PrintGCDateStamps -Xloggc:{文件路径} 从Java 9及更高版本开始: -Xlog 6.2、G1 疏散暂停或疏散失败 当我们看到G1撤离暂停时,则G1 GC没有足够的内存来存储幸存者或被提升的物体,或两者都没有。Java堆无法扩展,因为它已经达到了最大值。

    78720

    你应该知道的Java垃圾收集器 - 串行、并行、CMS、G1

    然而,如果堆大于4GB,那么你可能更适合最后一个算法--G1收集器。 4. G1收集器 在JDK 7 update 4 中引入的“第一收集器”(G1),是专门为更好地支持大于4GB的堆而设计的。 G1收集器利用多个后台线程来扫描堆,将其划分为多个区域,范围从1MB到32MB(取决于堆的大小)。 G1收集器首先会去扫描那些包含最多垃圾对象的区域,这种做法我们起名叫:Garbage first。 Java 8和G1收集器 另一个不错的改进就是Java 8 update 20的时候G1收集器开始支持字符串重复数据删除(String deduplication)。 Java 8和PermGen Java 8中最大的变化之一是删除了传统上为类元数据、内部字符串和静态变量分配的堆的permgen部分。在这之前,一般都要求开发人员来优化和tuning。 Java中一种全局暂停的现象 全局停顿,所有Java代码停止,native代码可以执行,但不能和JVM交互 多半由于GC引起 Dump线程 死锁检查 堆Dump GC时为什么会有全局停顿?

    1.6K80

    扫码关注腾讯云开发者

    领取腾讯云代金券