java入门之GC的算法与种类(4)

java基础

GC:垃圾收集(Garbage Collection),在系统运行过程当中,产生的无用对象\数据等占据着内存空间,这时,GC会回收掉这些无用空间.使程序有更多可用的空间.在c/c++中需要程序员去释放,但是在java中这些由GC来完成,也可防止内存泄漏.GC的对象为永久区和堆空间.

算法:

1.引用计数法:
是一个老牌的垃圾回收算法,通过引用计算来回收垃圾.使用者:COM/ActionScript3/Python.
基本思想:有一个对象的引用计数器来计数一个对象被引用的次数,当一个对象每被引用一次,所对应的引用计数器的计数就会加一,每被释放一次,他的引用计数器的计数就会减一.当引用计数器的计数为零时,表示该对象未被引用.
引用计数法的问题:
a.引用和去引用伴随加法和减法,影响性能.
b.很难处理循环引用.当出现以下情况时,右侧3个无用的循环对象会一直占据着空间而不能被释放,因为他们的引用计数都不为零.

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


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

4.复制算法
a.与标记-清除算法相比,复制算法是一种相对高效的回收方法.
b.不适用于存活对象较多的场合,如老年代.
c.将原有内存空间分为两块,每次只使用其中一块,在垃圾回收时,将正在使用的内存中的存活对象复制到未使用的内存块中,之后,清除正在使用的内存块中的所有对象,交换两个内存的角色,完成垃圾回收.

存在的问题:空间浪费,整合标记清理思想.

分代思想:

一句对象的存活周期进行分类,短命的对象归为新生代,长命的对象归为老年代.
根据不同代的特点,选取合适的收集算法
a.少量对象存活,适合复制算法
b.大对象存活,适合标记清理或者标记压缩.

GC算法总结:

引用计数-没有被java使用.
标记-清除/标记-压缩被使用.其中新生代使用复制算法.

可触及性:

可触及的:从根节点可以触及到这个对象.
可复活的:一旦所有引用被释放,就是可触及状态,在finalize()中可能复活该对象.不可回收.
不接触及的:在finalize()后,可能会进入不可触及状态,不可触及的对象不可能复活,可以回收.
经验:避免使用finalize(),操作不慎可能导致错误.
优先级低,何时被调用,不确定,何时发生GC也不确定.因此,可以使用try-catch-finally代替.
根:
a.栈中引用的对象,
b.方法区中静态成员或者常量引用的对象(全局对象),
c.JNI方法栈中引用的对象.
Stop-The-World
a.java中一种全局暂停现象.
b.全局暂停,所有java代码停止,native代码可以执行,但不能和JVM交互.
c.多半由于GC引起(Dump线程,死锁检查,堆Dump)


















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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值