课程咨询: 400-996-5531 / 投诉建议: 400-111-8989
认真做教育 专心促就业
随着互联网的不断发展,越来越多的人都在学习Java编程开发等互联网技术,而本文我们就通过案例分析来简单了解一下,java中垃圾收集的方法有哪些。
java中有四种垃圾回收算法,分别是标记清除法、标记整理法、复制算法、分代收集算法;
①标记-清除:
这是垃圾收集算法中基础的,根据名字就可以知道,它的思想就是标记哪些要被回收的对象,然后统一回收。
1:利用可达性去遍历内存,把存活对象和垃圾对象进行标记;
2:在遍历一遍,将所有标记的对象回收掉;
这种方法很简单,但是会有两个主要问题:1.效率不高,标记和清除的效率都很低;2.会产生大量不连续的内存碎片,导致以后程序在分配较大的对象时,由于没有充足的连续内存而提前触发一次GC动作。
②复制算法:
为了解决效率问题,复制算法将可用内存按容量划分为相等的两部分,然后每次只使用其中的一块,当一块内存用完时,就将还存活的对象复制到二块内存上,然后一次性清楚完一块内存,再将二块上的对象复制到一块。
但是这种方式,内存的代价太高,每次基本上都要浪费一般的内存。
于是将该算法进行了改进,内存区域不再是按照1:1去划分,而是将内存划分为8:1:1三部分,较大那份内存交Eden区,其余是两块较小的内存区叫Survior区。每次都会优先使用Eden区,若Eden区满,就将对象复制到二块内存区上,然后清除Eden区,如果此时存活的对象太多,以至于Survivor不够时,会将这些对象通过分配担保机制复制到老年代中。(java堆又分为新生代和老年代)
*③标记-整理:
1:利用可达性去遍历内存,把存活对象和垃圾对象进行标记;
2:将所有的存活的对象向一段移动,将端边界以外的对象都回收掉;
该算法主要是为了解决标记-清除,产生大量内存碎片的问题;当对象存活率较高时,也解决了复制算法的效率问题。它的不同之处就是在清除对象的时候现将可回收对象移动到一端,然后清除掉端边界以外的对象,这样就不会产生内存碎片了。
④分代收集:
现在的虚拟机垃圾收集大多采用这种方式,它根据对象的生存周期,将堆分为新生代和老年代。在新生代中,由于对象生存期短,每次回收都会有大量对象死去,那么这时就采用复制算法。老年代里的对象存活率较高,没有额外的空间进行分配担保,所以可以使用标记-整理或者标记-清除。
内存利用率:标记整理算法>标记清除算法>复制算法
内存连续性:标记整理算法=复制算法>标记清除算法
效率:
对象存活率不高:复制算法>标记清楚算法>标记整理算法对象存活率高:标记清除算法>复制算法>标记整理算法新生代对象存活率不高:选择复制算法
老年代对象存活率较高:选择标记清除算法标记整理算法
【免责声明】:本内容转载于网络,转载目的在于传递信息。文章内容为作者个人意见,本平台对文中陈述、观点保持中立,不对所包含内容的准确性、可靠性与完整性提供形式地保证。请读者仅作参考。更多内容请加danei456学习了解。欢迎关注“达内在线”参与分销,赚更多好礼。