Java虚拟机的垃圾收集

6 篇文章 0 订阅

Java虚拟机的垃圾收集

[1] GC需要完成的问题

哪些内存需要回收?

什么时候回收?

如何回收?

[2] 判断内存需要回收的算法

•引用计数算法(reference-counting) :每个对象有一个引用计数器,当对象被引用一次则计数器加1,当对象引用失效一次则计数器减1,对于计数器为0的对象意味着是垃圾对象,可以被GC回收。

•可达性算法(GC Roots Tracing):从GC Roots作为起点开始搜索,那么整个连通图中的对象便都是活对象,对于GC Roots无法到达的对象便成了垃圾回收的对象,随时可被GC回收。

采用引用计数算法的系统只需在每个实例对象创建之初,通过计数器来记录所有的引用次数即可。而可达性算法,则需要再次GC时,遍历整个GC根节点来判断是否回收。对于对象之间循环引用的情况,引用计数算法,则GC无法回收这两个对象,而可达性算法则可以正确回收。

目前虚拟机基本都是采用可达性算法

[3] 什么时候回收?

当对象死亡时则执行回收。而在可达性算法中,即使是不可达的对象,也并非是“非死不可”的。真正宣告一个对象的死亡,至少要经历两次标记过程。

当对象不可达时,则被第一次标记并且进行一次筛选,筛选的条件是此对象是否有必要执行finalize()方法。若对象可以执行finalize()方法,且在方法中重新与引用链上的任何一个对象建立关联,则在第二次标记时,它就被移除出“即将回收”集合,而没有逃脱的对象基本上就真的被回收了。

 

[4] 垃圾收集算法

算法

简介

优点

缺点

标记-清除算法

标记后直接清除。

最基础的收集算法。

效率低;产生大量不连续的碎片

复制算法

分块使用,一块用完后将存活的对象复制到另一块后,将使用的这块一次清理。

 

无内存碎片,实现简单,运行高效。

 

可使用的内存减少;无法保证survivor可以保存所有的存活对象,需依赖其他内存(如老生代)进行分配担保。

标记-整理算法

标记后,将所有存活的对象都向一端移动后,直接清理掉端边界以外的内存。

不会产生大量的不连续的碎片。

在对象存活率高时,执行效率低

 

分代收集算法

当前商业虚拟机的垃圾收集都采用“分代收集”算法。

根据内存中对象的存活周期不同,将内存划分为几块,java的虚拟机中一般把内存划分为新生代和年老代,当新创建对象时一般在新生代中分配内存空间,当新生代垃圾收集器回收几次之后仍然存活的对象会被移动到年老代内存中,当大对象在新生代中无法找到足够的连续内存时也直接在年老代中创建。

新生代中,每次垃圾收集时都发现有大批对象死去,只有少量存活,选择复制算法进行回收。老生代中,对象存活率高,没有额外空间对它进行分配担保,使用“标记-清理”算法或者“标记-整理”算法来进行回收。

[5] 垃圾收集器

参考转载博文:GC算法 垃圾收集器http://blog.csdn.net/iceframemo/article/details/79440540

参考:

《深入理解Java虚拟机》 周志明著

 

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值