GC-算法与种类

GC-算法与种类

GC的概念:

​ Garbage Collection(垃圾收集)

​ 1960年List使用了GC

​ 在Java中,GC的对象是堆空间和永久区.

​ 引入的目的是防止由程序员认为的引入的内存泄漏;

GC-算法

引用计数法:

​ 老牌的垃圾回收算法,通过引用计数来回收垃圾;使用者 COM、ActionScript3、Python;

​ 引用计数器的实现很简单,对于一个对象A,只要有任何一个对象引用了A,泽A的引用计数器就加一,当对A的引用失效时,引用计数器就减去一,只要对象A的引用计数器的值为0,则对象A就不可能再被使用;

​ 引用计数法会出现以下的问题:

​ 对象的引用与去引用都会伴随着加法和减法,对程序的性能会有一定的影响;

​ 很难处理循环引用的现象;

标记清除算法:

​ 标记-清除算法是现代垃圾回收算法的思想基础;标记-清除算法将垃圾回收分为两个阶段:标记阶段和清除阶段;一种可行的实现是,在标记阶段,首先通过根节点,标记所有经根节点开始可达的对象;因此,未被标记的对象就是未被引用的垃圾对象;然后,在清除阶段,清除所有未被标记的对象;

在这里插入图片描述

标记-压缩算法

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

在这里插入图片描述

​ 标记压缩对标记清除有什么优势呢?

​ 标记清除:会产生大量的碎片空间,会影响分配;

复制算法

​ 与标记-清除算法相比,复制算法是一种相对高效的垃圾回收算法;

​ 不适用于存活对象较多的场合,如老年代;

​ 将原有的内存空间分为两块(两块内存大小一样),每次只使用其中一块,在垃圾回收时,将正在使用的内存中的存活对象复制到未使用的内存块中,之后,清除正在使用内存块中的所有对象,交换两个内存的角色,完成垃圾回收;

​ 缺点:最大的问题是对空间的浪费 整合标记清理思想;

在这里插入图片描述

分代思想:

​ 依据对象的存活周期进行分类,短命对象归为新生代,长命对象归为老年代;

​ 根据不同代的特点,选取合适的垃圾回收算法:

​ 少量对象存活,适合复制算法;

​ 大量对象存活,适合标记清理或者标记压缩算法;

在这里插入图片描述

​ 引用计数法是没有被Java采用;新生代(幸存者区(即from区和to区))使用的是复制算法;

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

可触及性

​ 可触及的:从根节点可以触及到这个对象;

​ 可复活的:一旦所有引用被释放,就是可复活状态;

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

​ 不可触及的:在finalize()后,可能会进入不可触及状态;

​ 不可触及的对象不可能复活;

​ 可以回收;

在这里插入图片描述

​ 经验:避免使用finalize(),操作不慎可能导致错误;

​ 优先级低,何时被调用不确定,也即何时发生GC不确定;

​ 可以使用try-catch-finally来替代它;

根(即哪些对象可以称为根对象呢?)

​ --栈中引用的对象;

​ --方法区中静态成员或者常量引用的对象(全局对象);

​ --JNI方法栈中引用对象;

Stop-The-World

​ java中的一种全局暂停的现象;全局停顿,所有java代码停止,native代码可以执行,但不能和JVM进行交互;

​ 多半是由于GC引起的:

​ --Dump线程

​ --死锁检查

​ --堆Dump

在这里插入图片描述

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值