G1垃圾收集分类-JVM(十四)

这篇具有很好参考价值的文章主要介绍了G1垃圾收集分类-JVM(十四)。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

上篇文章说了G1不在是连续的老年代年轻代,而是分为不同的region,有eden,survivor,old,humongous,当大于百分之50region的数据则直接进入humongous,如果对象太大,会连续的存储,分为初始标记,并发标记,最终标记,筛选标记,其中只有并发标记不会STW,G1可以设置STW的时候,从而利用成本算法排序回收一部分垃圾。

G1垃圾收集器-JVM(十三)
  • G1垃圾收集器特性

G1在后台会维护一个优先列表,每次在允许收集的时间内,选择最大价值的region回收(garbage-first的由来),比如一个region花200ms回收10M垃圾,另一个花20ms回收20M的垃圾,肯定会优先选择后者,保证在优先时间内高效回收。

  1. 并发并行:G1充分利用多核CPU电脑性能缩短STW的时间,其他收集器需要STW,而G1可以通过并发来一起执行。
  2. 分代收集:已经抛弃物理分代收集概念,但仍然有region区域。
  3. 空间整理:碎片更少,底层采用的是复制算法。Cms采用的是标记清除。
  4. 可预测停顿:这是相对于其他垃圾收集器最大优势,可以自己设置stw时间。

(-XX:MaxGCPauseMills)

当然这个值设置太小也不好,如果设置20ms,很可能stw停顿时间太短,导致每次GC回收的垃圾有限,最终垃圾收集器的速率跟不上分配器速度,导致垃圾慢慢堆积,最后发生fullGC,时间一长反而性能更低,正常默认是200ms,设置200ms到300ms都比较合理。

  • G1垃圾收集器分类

分为YoungGC、MixedGC、FullGC。

YoungGC:Minor GC并不是eden满了就触发,而是会看-XX:MaxGCPauseMills设定的值,如果远远小于这个值会就继续增加eden,直到计算接近这个值,才会触发minorGC。

MixedGC:不是fullGC,老年代占有率达到-XX:InitiatingHeapOccupancyPercent设置的值触发,这时候会用复制算法,回收所有youngGC和部分old区域以及大对象区域的region,主要部分是根据设定的STW时间值来计算成本,从region区域拷贝到另一个region,在拷贝过程中,如果发现区域不够用,则会触发fullGC。

(比如当老年代这个参数设置百分之50,但是其他区域都被年轻代占用了,那老年代有那么多区域要复制,没有足够多的空region来复制,这时候就会触发fullGC)

FullGC:停止系统其他线程,单线程进行标记、清理和整理。这个过程非常耗时,整理出来region给下次MixedGC使用。(Shenandoah优化成多线程)

  • G1参数

开启G1参数:-XX:+UseG1GC

指定线程数:-XX:ParallelGCThreads

指定分区大小:-XX:G1HeapRegionSize,必须是2的N次幂,保证能分成2048个region,每个region最大32M。

目标暂停时间:-XX:MaxGCPauseMills

新生代初始空间:-XX:G1NewSizePercent,默认百分之5

新生代最大空间:-XX:G1MaxNewSizePercent,默认百分之60

-XX:TargetSurvivorRatio:survivor默认是百分之50,当survivor区域里的一批对象(年代1+年代2....+年代n)总和超过survivor的百分之50,此时会把年龄代1以上的对象都放入old。

-XX:MaxTenuringThreshold:最大年龄阀值(默认15)

-XX:InitiatingHeapOccupanyPercent:老年代占用空间整个堆阈值(默认45),则会发生MixedGC,比如2048个region,当有接近1000个region时候,则会发生MixedGC。

-XX:G1MixedGCLiveThresholdPercent(默认百分之85):判断region里存活的对象低于这个值才回收region,如果超过这个值,代表存活的对象太多,则回收意义不大,优先考虑回收其他region。

-XX:G1MixedGCCountTarget:在一次回收过程中指定做几次筛选回收(默认8次),在筛选回收阶段会分次回收,回收一会暂停回收,后面又继续开始,这样不至于让停顿时间太长。防止垃圾太多的情况,需要回收时间太长,所以垃圾太多的情况需要设置大一点,分段慢慢回收。

(正常设置1次就好)

-XX:G1HeapWastePercent(默认百分5):gc过程中空出来的region是否充足的阈值,在混合回收的时候,用复制算法,所以需要有空闲的region提供复制,一旦空闲的region到达了百分之5,立刻停止混合回收,代表这次混合回收结束。

所以-XX:MaxGCPauseMills这个参数不适合设置太小,不然每次STW时间太短导致清理不干净,触发fullGC。

  1. 大内存的情况下适合G1
  2. 对象分配和晋升速度变化很大。
  3. 垃圾回收时间特别长,超过1s
  4. 8g以上堆内存可以用。
  5. 停顿时间500ms以上。

Kafka每个节点可以承受几十万的消息,假设按之前的算法算,每个消息1kb,那么3万消息就是30 000kb,涉及到库存等消息,30 000*200=6 000 000kb。600M每次进入eden,eden一共也才2个g不到,3s就会放满,则会频繁fullGC,这时候则需要增大机器内存,之前我们假设的内存是4核8G。所以为了满足kafka高吞吐的特性,机器内存要足够大,如果40个G的eden,这时候至少需要接近20s才可以放满。文章来源地址https://www.toymoban.com/news/detail-600711.html

到了这里,关于G1垃圾收集分类-JVM(十四)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • Java虚拟机(JVM):垃圾收集算法

    目录 一、分代收集理论 二、标记-清除算法 三、标记-复制算法  四、标记-整理算法 分代收集理论建立在两个分代假说之上: 1、弱分代假说:绝大多数对象都是朝生夕灭的。 2、强分代假说:熬过越多次垃圾收集过程的对象就越难以消亡。 这两个分代假说共同奠定了多款垃

    2024年02月12日
    浏览(34)
  • 【JVM】JVM收集器CMS与G1区别

    CMS收集器和G1收集器的区别 CMS收集器是老年代的收集器,可以配合新生代的Serial和ParNew收集器一起使用 G1收集器收集范围是老年代和新生代。不需要结合其他收集器使用 CMS收集器以最小的停顿时间为目标的收集器。 G1收集器可预测垃圾回收的停顿时间(建立可预测的停顿时间

    2024年02月08日
    浏览(74)
  • JVM G1垃圾回收机制介绍

    G1(Garbage First)收集器 (标记-整理算法): Java堆并行收集器,G1收集器是JDK1.7提供的一个新收集器,G1收集器基于“标记-整理”算法实现,也就是说不会产生内存碎片。此外,G1收集器不同于之前的收集器的一个重要特点是:G1回收的范围是整个Java堆(包括新生代,老年代),而其

    2024年02月13日
    浏览(23)
  • JVM——垃圾回收器G1+垃圾回收调优

    定义: 取代了CMS垃圾回收器。和CMS一样时并发的。  适用场景: 物理上分区,逻辑上分代。   相关JVM参数: -XX:+UseG1GC -XX:G1HeapRegionSize=size -XX:MaxGCPauseMillis=time  三个回收阶段,第一个是新生代回收,第二个是新生代+CM,第三个是混合回收。 当老年代内存超过阈值,会在新生代垃

    2024年02月12日
    浏览(33)
  • JVM垃圾回收器G1详解

    在我们应用程序所应对的业务越来越庞大、复杂,用户越来越多,没有GC就不能保证应用程序正常进行,而经常造成STW的GC又跟不上实际的需求,我们需要不断地尝试对GC进行优化。G1(Garbage-First)垃圾回收器是在Java7 update4之后引入的一个新的垃圾回收器,是当今收集器技术发

    2024年02月09日
    浏览(28)
  • 从原理聊JVM(二):从串行收集器到分区收集开创者G1

    作者:京东科技 康志兴 随着Java的进化过程,涌现出各种不同的垃圾回收器,从串行执行到并行执行,从高吞吐到低延迟,终极目标就是让开发人员专注于程序的代码书写而无需关注内存管理。 JDK早期出现的垃圾回收器通常单独作用于不同分代,到后期出现的G1开始,才可以

    2023年04月24日
    浏览(30)
  • 【JVM】JVM垃圾收集器

    垃圾收集器是负责 执行垃圾回收的组件 ,它们用于 管理Java程序运行时的内存分配和释放 。垃圾收集器的主要任务是 自动回收不再使用的内存对象 ,并将 内存空间重新回收 以供程序继续使用。 Serial和Serial Old串行垃圾收集器,是指 使用单线程进行垃圾回收 ,堆内存较小,

    2024年02月13日
    浏览(32)
  • Java虚拟机(JVM)垃圾收集器、新生代、老年代、永久代以及内存分配策略

    在 Java 中,堆被划分成两个不同的区域:新生代 ( Young )、老年代 ( Old )。而新生代 ( Young ) 又被划分为三个区域:Eden、From Survivor、To Survivor。这样划分的目的是为了使 JVM 能够更好的管理堆内存中的对象,包括内存的分配以及回收。 新生代中一般保存新出现的对象,所以每次

    2024年02月04日
    浏览(67)
  • 【JVM】垃圾收集算法

    当前商业虚拟机的垃圾收集器,大多数都遵循了“分代收集”(Generational Collection)[1]的理论进 行设计,分代收集名为理论,实质是一套符合大多数程序运行实际情况的经验法则,它建立在两个分代假说之上: 弱分代假说(Weak Generational Hypothesis):绝大多数对象都是朝生夕

    2024年02月10日
    浏览(33)
  • jvm垃圾收集算法

    由于《分代收集理论》和不同垃圾收集算法,Java堆应该被划分为不同区域,一般至少会把Java堆划分为 新生代(Young Generation) 和 老年代(Old Generation)两个区域 。 垃圾收集器可以只回收其中某一个或者某些部分的区域对应不同的垃圾回收: “Minor GC”:新生代的垃圾收集

    2024年02月07日
    浏览(32)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包