G1 垃圾回收器解决的问题

背景

Java G1(Garbage First)垃圾回收器的诞生背景与Java平台对内存管理和垃圾回收的不断演进密切相关。在了解G1诞生的背景之前,我们先简要回顾一下Java平台的垃圾回收发展历程:

Serial收集器:最初的Java垃圾回收器,是一种单线程的垃圾回收器,适用于小型或简单的应用程序。
Parallel收集器:随着硬件的发展,多核处理器成为标准配置,Java引入了Parallel收集器,利用多线程来提高垃圾回收的效率。
CMS(Concurrent Mark-Sweep)收集器:针对长时间停顿时间的问题,CMS收集器引入了并发标记和清理阶段,尽量减少了垃圾回收时的停顿时间,适用于需要更低停顿时间的应用。

cmc 问题

内存碎片化问题:

在大型Java应用程序中,频繁的内存分配和回收容易导致内存碎片化,使得连续的可用内存空间变得稀缺,进而影响了应用程序的性能和稳定性。

更低的停顿时间:

随着互联网应用的普及和复杂度的增加,对于停顿时间的要求变得越来越严格。特别是对于大型在线服务,长时间的停顿可能会导致用户体验下降甚至服务不可用。

更好的吞吐量:

除了降低停顿时间外,对于大型应用程序来说,也需要保持高的吞吐量,即在给定时间内尽可能多地执行应用程序代码。

g1 如何解决

基于区域的内存管理:

G1将堆内存划分为多个大小相等或近似相等的区域(Region),每个区域都可以作为新生代或老年代来使用。这种区域化的内存管理使得G1可以更加灵活地管理内存,有针对性地选择区域进行垃圾回收,从而避免了全局性的停顿,也可以解决内存碎片化问题。

这里非常多的地方讲到了会有这句话,分成region这种能解决碎片化的问题,但是没人从理论讲清楚为啥这种结构是可以。内存碎片就是有很多地方空白的地方可以分配新,但是空白地方太小,导致没有地方可以放,只能回收其它的地方来分配新对象,要是空白的地方能变大就小就好了,就可以灵活的分配对象大小了,于是就有了G1这种,区域可以灵活作为新生代和老年代。

在这里插入图片描述

增量式标记:

G1使用增量式标记算法,在垃圾回收过程中将标记阶段分解为多个小步骤,并与应用程序交替执行。这样可以将长时间的停顿分解为多个短暂的停顿,使得停顿时间更加可控,降低了对应用程序的影响。

并行标记和清理:

在标记和清理阶段,G1垃圾回收器利用多线程并行地执行标记和清理操作,以提高垃圾回收的效率。这种并行处理的方式能够充分利用多核处理器的性能,加速垃圾回收过程,从而缩短了停顿时间。

自适应的停顿时间目标:

G1垃圾回收器采用了自适应的停顿时间目标策略,根据当前的堆使用情况和用户设定的性能目标动态地调整停顿时间目标。这样可以在保证一定性能的前提下,尽可能地减少垃圾回收带来的停顿时间,提高了应用程序的响应速度和用户体验。

优先处理垃圾最多的区域:

G1垃圾回收器采用了“Garbage First”(G1)的策略,优先处理包含最多垃圾对象的区域,以最大程度地提高垃圾回收的效率。这种优先处理的方式能够尽快地回收垃圾对象,减少了垃圾回收的停顿时间。

  • 3
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

wending-Y

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值