课程咨询: 400-996-5531 / 投诉建议: 400-111-8989
认真做教育 专心促就业
复制算法是程序员在学习java虚拟机垃圾回收算法会经常用到的一个算法,而今天我们就通过案例分析来了解一下,复制算法的概念与优缺点分析。
复制算法每次都是对整个半区进行内存回收,这样就减少了标记对象遍历的时间,在清除使用区域对象时,不用进行遍历,直接清空整个区域内存,而且在将存活对象复制到保留区域时也是按地址顺序存储的,这样就解决了内存碎片的问题,在分配对象内存时不用考虑内存碎片等复杂问题,只需要按顺序分配内存即可。
复制算法简单高效,优化了标记/清除算法的效率低、内存碎片多的问题。但是它的缺点也很明显:
1、将内存缩小为原来的一半,浪费了一半的内存空间,代价太高;
2、如果对象的存活率很高,极端一点的情况假设对象存活率为全部,那么我们需要将所有存活的对象复制一遍,耗费的时间代价也是不可忽视的。
基于以上复制算法的缺点,由于新生代中的对象几乎都是“朝生夕死”的(达到98%),现在的商业虚拟机都采用复制算法来回收新生代。由于新生代的对象存活率低,所以并不需要按照1:1的比例来划分内存空间,而是将内存分为一块较大的Eden空间和两块较小的FromSurvivor空间、ToSurvivor空间,三者的比例为8:1:1。每次使用Eden和FromSurvivor区域,ToSurvivor作为保留空间。
GC开始时,对象只会存在于Eden区和FromSurvivor区,ToSurvivor区是空的。GC进行时,Eden区中所有存活的对象都会被复制到ToSurvivor区,而在FromSurvivor区中,仍存活的对象会根据它们的年龄值决定去向,年龄值达到年龄阀值(默认为15,新生代中的对象每熬过一轮垃圾回收,年龄值就加1)的对象会被移到老年代中,没有达到阀值的对象会被复制到ToSurvivor区。接着清空Eden区和FromSurvivor区,新生代中存活的对象都在ToSurvivor区。接着,FromSurvivor区和ToSurvivor区会交换它们的角色,也就是新的ToSurvivor区就是上次GC清空的FromSurvivor区,新的FromSurvivor区就是上次GC的ToSurvivor区,
总之,不管怎样都会保证ToSurvivor区在一轮GC后是空的。GC时当ToSurvivor区没有足够的空间存放上一次新生代收集下来的存活对象时,需要依赖老年代进行分配担保,将这些对象存放在老年代中。
【免责声明】本文系本网编辑部分转载,转载目的在于传递更多信息,并不代表本网赞同其观点和对其真实性负责。如涉及作品内容、版权和其它问题,请在30日内与管理员联系,我们会予以更改或删除相关文章,以保证您的权益!更多内容请在707945861群中学习了解。