
课程咨询: 400-996-5531 / 投诉建议: 400-111-8989
认真做教育 专心促就业
算法的学习与应用是每一位Java编程开发程序员都需要熟练掌握的一个编程技术知识之一,而本文我们就通过案例分析来简单了解一下,Java编程开发垃圾回收算法原理与应用分析。
1.标记清除
原理:
从根集合节点进行扫描,标记出所有的存活对象,后扫描整个内存空间并清除没有标记的对象(即死亡对象)
适用场合:
存活对象较多的情况下比较高效
适用于年老代(即旧生代)
缺点:
标记清除算法带来的一个问题是会存在大量的空间碎片,因为回收后的空间是不连续的,这样给大对象分配内存的时候可能会提前触发fullgc。
2.复制算法
原理:
从根集合节点进行扫描,标记出所有的存活对象,并将这些存活的对象复制到一块儿新的内存(图中下边的那一块儿内存)上去,之后将原来的那一块儿内存(图中上边的那一块儿内存)全部回收掉
适用场合:
存活对象较少的情况下比较高效
扫描了整个空间一次(标记存活对象并复制移动)
适用于年轻代(即新生代):基本上98%的对象是”朝生夕死”的,存活下来的会很少
缺点:
需要一块儿空的内存空间
需要复制移动对象
3.标记整理
原理:
从根集合节点进行扫描,标记出所有的存活对象,后扫描整个内存空间并清除没有标记的对象(即死亡对象)(可以发现前边这些就是标记-清除算法的原理),清除完之后,将所有的存活对象左移到一起。
适用场合:
用于年老代(即旧生代)
缺点:
需要移动对象,若对象非常多而且标记回收后的内存非常不完整,可能移动这个动作也会耗费一定时间
扫描了整个空间两次(一次:标记存活对象;二次:清除没有标记的对象)
优点:
不会产生内存碎片
4.分代收集算法
当前商业虚拟机的垃圾收集都采用“分代收集”算法,这种算法并没有什么新的思想,只是根据对象存活周期的不同将内存划分为几块。一般是把Java堆分为新生代和老年代,这样就可以根据各个年代的特点采用适当的收集算法。
在新生代中,每次垃圾收集时都发现有大批对象死去,只有少量存活,那就选用复制算法,只需要付出少量存活对象的复制成本就可以完成收集。而老年代中因为对象存活率高、没有额外空间对它进行分配担保,就必须使用“标记—清理”或者“标记—整理”算法来进行回收。
【免责声明】:本内容转载于网络,转载目的在于传递信息。文章内容为作者个人意见,本平台对文中陈述、观点保持中立,不对所包含内容的准确性、可靠性与完整性提供形式地保证。请读者仅作参考。更多内容请加danei0707学习了解。欢迎关注“达内在线”参与分销,赚更多好礼。