gc回收

如果参加Java研发的面试,很容易被面试官问到“说说你对gc回收有什么了解”,所以今天整理一下这部分内容。


首先要解决的一个问题是如何判断哪些Java对象是可以回收的。这就要说到根搜索算法gcroots了,实现这个算法首先要构造树状结构,将对象作为节点,将调用关系作为分支。能用来做根节点的对象有虚拟机栈中引用的对象、方法区中静态变量引用的对象、方法区中常量引用的对象、本地栈中JNI引用的对象。这些根节点的对象调用的对象可以向下形成分支,维护一个动态的树状结构。

可以通过遍历这个树状结构,找到不再被引用的对象,可以对这些对象进行回收。因为这个树状结构是动态改变的,所以要找到一个线程执行完毕的安全点来生成一个像是快照功能的临时静止树状结构,进行遍历工作。以上是根搜索算法,还有一种不太经常被使用的引用计数器算法

这个就比较好理解了,每个对象维护一个计数器,如果对象被引用就+1,用完了就-1。所以当技术器归零的时候,这个对象不再被引用了,就可以回收了。这种方法存在一个缺陷就是循环引用,A引用B,B又引用A,就会陷入一个僵局。想要解决的话,可能要通过一些同步互斥的设置。


解决完了哪些Java对象可以回收,就可以进入到了解回收算法的步骤了。标记清除算法采用的是把存储区域里可以清除的对象第一次先标记出来,然后第二次清除的思路,碎片化问题比较严重。复制算法采用的是把存储区域一分为二,把空白的块复制到要清除的块的位置,改善了碎片化的问题,但是可用空间变得有限了。标记整理算法采用的是把被标记的对象挪到一起,空白对象空间前向归置,中间设置界限,界限外的被清除。分代收集算法就要把对象分成新生代(清除多,采用复制算法)和老年代(清除少,采用标记清除算法)来处理。


最后就是归纳一下gc垃圾收集器:Serial(单线程、复制),ParNew(Serial的多线程版本),Parallel Scavenge(多线程、复制),Serial Old(单线程、标记整理),Parallel Old(多线程、标记整理),CMS(多线程、标记清除),G1(不分新老、标记整理、低停顿)

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
JVM(Java虚拟机)的垃圾回收GC)机制是自动管理内存的一种机制。它通过自动识别和回收不再使用的对象来释放内存空间,以避免内存泄漏和程序中的内存溢出错误。 JVM中的垃圾回收器负责执行垃圾回收。当对象不再被引用时,垃圾回收器将标记这些对象为垃圾,并将它们从内存中回收。以下是JVM GC回收机制的一般过程: 1. 标记阶段(Marking Phase):从根对象(如线程栈中的引用、静态变量等)开始,垃圾回收器将遍历对象图并标记可达的对象。 2. 清除阶段(Sweeping Phase):垃圾回收器将清除标记为垃圾的对象,并回收它们占用的内存空间。 3. 压缩阶段(Compacting Phase):如果需要,垃圾回收器会对存活的对象进行整理,使它们在内存中连续排列,从而减少碎片化并提高内存的利用率。 4. 再分配阶段(Allocation Phase):如果需要,垃圾回收器会为新对象分配内存空间。 具体的垃圾回收算法和策略可能因不同的JVM实现而异。常见的垃圾回收算法包括标记-清除(Mark and Sweep)、复制(Copying)、标记-整理(Mark and Compact)等。JVM还提供了不同的垃圾回收器,如Serial、Parallel、CMS(Concurrent Mark Sweep)、G1(Garbage-First)等,以满足不同场景下的需求。 总而言之,JVM的垃圾回收机制通过自动识别和回收不再使用的对象来管理内存,确保程序运行时的内存使用效率和稳定性。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值