GC垃圾回收算法

1.引用计数法

引用计数法的算法很简单,对于一个对象A,任何一个对象引用了A,A引用的计数器就会+1,当引用失效时计数器就会-1.只要A的引用计数器为0时,则对象A就不能再被使用了.这个垃圾回收法因为无法解决循环引用的问题,已不被jvm使用.

2.标记清除法

标记-清除算法是现代垃圾回收算法的思想基础.标记-清除算法将垃圾回收分为两个阶段:标记阶段和清除阶段.在标记阶段,首先通过根节点标记所以从根节点开始的可达对象,剩下没有被标记的就是垃圾对象或者是空对象啦.


3.标记压缩法

标记-压缩算法适用于对象存活较多的场合如老年代.他在标记-清除的基础上做了一些优化.和标记-清除一样,标记-压缩算法也首先需要从根节点开始,对所有可达对象做一次标记.但之后,它并不简单的清理未标记的对象,而是将所有对象压缩到内存的另一端.之后 清理边界外所以的空间



4.复制算法

1)复制算法与标记清除法相比是一种相对高效的垃圾回收算法

2)但是不使用与存活对象较多的场合例如老年代

3)基本思想是将原有的空间分为两块,每次只使用其中一块,在垃圾回收时,将正在使用内存中存活的对象复制到未使用的内存块中,之后,清除正在使用的内存块中所有的对象,交换两个内存的角色,完成垃圾回收.

4)最大的问题就是空间浪费




标记清除/标记压缩算法在老年代被明确使用的垃圾收回算法.

复制算法是在新生代被明确使用的算法.


所有的算法,需要能够识别一个垃圾对象,因此需要给出一个可触及性的定义.


可触及性定义:

1)可触及的

-从根节点可以触及到这个对象

2)可复活的

-一旦所有引用被释放,就是可复活状态

-因为在finalize()中可能复活该对象

不可触及的定义:

- 在finalize()后,可能进入不可触及状态

-不可触及的对象不可能复活

-可以回收


finalize—方法名。Java 技术允许使用 finalize() 方法在垃圾收集器将对象从内存中清除出去之前做必要的清理工作。这个方法是由垃圾收集器在确定这个对象没有被引用时对这个对象调用的。它是在 Object 类中定义的,因此所有的类都继承了它。子类覆盖 finalize() 方法以整理系统资源或者执行其他清理工作。finalize() 方法是在垃圾收集器删除对象之前对这个对象调用的。

垃圾回收(Garbage Collection,GC算法是指在计算机程序运行时,自动回收不再使用的内存空间的一种算法。常见的 GC 算法有以下几种: 1. 标记-清除算法(Mark-Sweep):该算法分为两个阶段,首先标记出所有要回收对象,然后统一回收所有被标记的对象。该算法会产生内存碎片,容易造成空间浪费。 2. 复制算法(Copying):该算法将可用内存空间分为两块,每次只使用其中一块,在回收时将正在使用的内存中的存活对象复制到未使用的内存块中,然后清空正在使用的内存块中的所有对象。该算法不会产生内存碎片,但需要额外的内存空间。 3. 标记-整理算法(Mark-Compact):该算法标记出所有要回收对象,然后将所有存活的对象移动到内存的一端,然后清空端边界以外的所有内存。该算法不会产生内存碎片,但需要移动存活对象,可能会影响程序能。 4. 分代收集算法(Generational):该算法根据对象的存活时间将内存分为不同的代,通常将新生成的对象放在新生代中,存活时间较长的对象放在老年代中。在新生代中使用复制算法,在老年代中使用标记-整理算法。该算法结合了复制算法和标记-整理算法的优点,可以有效地提高 GC 的效率。 以上是常用的垃圾回收算法,不同的算法适用于不同的场景,开发人员需要根据应用程序的特点选择合适的算法
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值