GC的触发,算法

本文介绍了Java垃圾收集(GC)的触发条件,详细解析了MinorGC和Full GC的发生情况,并探讨了对象的晋升过程。同时,文章讨论了三种经典的GC算法:Mark-Sweep、Copying和Mark-Compact,分析了它们的工作原理和优缺点。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

GC的触发:

运行时数据区中最大的区域的堆内存,我们说堆是GC主要处理的区域,所以又叫GC堆。如果要知道GC的触发过程那么对内存还需要继续划分
在这里插入图片描述
对象的创建和上面的区域发生密切的关系,其中也会在上面的区域触发GC
分析GC触发的过程:
1.当创建一个新对象的时候需要为新对象申请空间,在伊甸园区申请,但是需要判断一点园区的空间是否充足,充足则申请成功,如果不充足则触发MinorGC回收不活跃的对象(不经常使用的对象)【采用的算法是复制算法】,回收之后再判断一点园区空间是否充足,充足则申请成功。【GC时把存活的对象从一块空间(From space)复制到另一块空间(To space),再把原先的那块内存(Form space)清理干净,最后调换From space 和 To space 的逻辑角色(这样下一次 GC 的时候还可以按这样的方式进行),当启动MinorGC 的时候会停止应用线程,启动GC回收线程,这个线程是一个守护线程】

2.如果依然不充足,则判断存活区空间是否充足,充足则将伊甸园区的部分活跃对象移到存活区,伊甸园区的空间申请成功

3.如果村获取的空间不足则判断老年代,如果充足则将存活区的部分活跃对象保存到老年代,之后将伊甸园区的活跃对象保存到存活区,空间申请成功

4、如果老年代的空间不充足则触发Full GC(MajorGC)让Jvm进行完全彻底的垃圾回收,之后再判断老年代的空间是否充足,充足则将存活区的活跃对象移到老年代,再将伊甸园区的活跃对象移到存活区,空间申请成功。如果触发Full GC之后老年代的空间依然不足则会出现OOM(Out Of Memory)错误。

这种活跃对象逐步往上移动的过程叫做对象的晋升
以上就是对象的创建与GC的基本关系过程

面试题:

什么条件下回触发MinorGC 和Full GC?
答: 当创建对象的时候Eden的空间不足则触发MinorGC,MinorGC非常频繁,一般回收速度也比较快,Survivor满不会引发MinorGC
当老年代空间不足的时候会触发Full GC,Full GC 会同时将老年代和新生代的垃圾进行回收。Full GC又叫做Major GC
在这里插入图片描述

面试题:

1、 String s = new String(“abc”) ; 创建了多上个对象?
答:创建了2个对象,会在编译期创建一个"abc"保存到对象池(常量池)

运行期的出现了new关键字的时候会将对象池中的"abc"复制到堆内存中保存。

2、String s1 = new String(“abc”) ;String s2 = new String(“abc”) ; 创建了多少个对象?

答:创建了三个对象,编译器会在对象池中创建"abc",在运行期会将对象池中的"abc"对象复制两个到堆区。

3、 String str=“abc”;String str1=new String(“abc”),一共创建了几个对象呢?

答:创建了两个对象,编译器创建在对象池中创建一个"abc",运行时候会将对象池中的"abc"复制一份到堆中。

----------------------------------------------------------------------------------

GC的算法

1.Mark-Sweep(标记-清除)算法

这是最基础的垃圾回收算法,之所以说它是最基础的是因为它最容易实现,思想也是最简单的。标记-清除算法分为两个阶段:标记阶段和清除阶段。标记阶段的任务是标记出所有需要被回收的对象,清除阶段就是回收被标记的对象所占用的空间。具体过程如下图所示:
在这里插入图片描述
从图中可以很容易看出 标记-清除 算法实现起来比较容易,但是有一个比较严重的问题就是容易产生内存碎片,碎片太多可能会导致后续过程中需要为大对象分配空间是无法找到足够的空间而提前触发新的一次垃圾收集动作

2.Copying(复制)算法
为了解决 Mark-Sweep算法的缺陷,Copying算法就被提了出来。它将可用内存按容量划分为大小相等的两块,每次只使用其中的一块。当着一块的内存用完了,就将还存活着的对象复制到另外一块上面,然后再把已使用的内存空间一次清理掉,这样一来就不容易出现内存碎片的问题。具体过程如下图所示:
在这里插入图片描述
这种算法虽然实现简单,运行高效且不容易产生内存碎片,但是却对内存空间的使用做出了高昂的代价,因为能够使用的内存缩减到原来的一半。很显然,Copying算法的效率跟存活对象的数目多少有很大的关系,如果存活对象很多,那么Copying算法的效率将大大降低。我们的新生代GC算法采用的是这种算法
3.Mark-Compact(标记-整理)算法
为了解决 Copying 算法的缺陷,充分利用内存空间,提出了 Mark-Compact 算法。该算法标记阶段和 Mark-Sweep 一样,但是在完成标记之后,它不是直接清理可回收对象,而是将可回收对象都向一端移动,然后清理掉端边界以外的内存。具体过程如下图:
在这里插入图片描述

上面的是一些常见的垃圾收集算法,垃圾收集算法是内存回收的理论基础,而垃圾收集器就是回收算法的具体实现,用户可以根据自己的需求组合出新生代和老年代使用的收集器

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值