- 复制算法的核心就是,将原有的内存空间一分为二,每次只用其中的一块,在垃圾回收时,将正在使用的对象复制到另外一个内存空间中,然后将该内存空间清空,交换两个内存的角色,完成垃圾回收。
- 如果内存中的垃圾对象较多,需要复制的对象就较少,这种情况下适合使用该方式并且效率比较高,反之,则不适合。
- 优点:在垃圾对象多的情况下,效率较高。清理后,内存无碎片。
- 缺点:在垃圾对象少的情况下,不适用,如:老年代内存。分配的2块内存空间,在同一个时刻,只能使用一般,内存使用率较低。
垃圾回收
复制对象
交换角色
- 实际运用
- 在GC开始的时候,对象只会存在于Eden区和名为“From”的Survivor区,Survivor区”To”是空的。
- 紧接着进行GC,Eden区中所有存货的对象都会被复制到“To”,而在“From”区中,仍存活的对象会根据他们的年龄值来决定去向。年龄到达一定值(年龄阀值,可以通过-XX:MaxTenuringThreshold来设置)的对象会被移动到年老代中,没有达到阀值的对象会被复制到“To”区域。
- 经过这次GC后,Eden区和From区已经被清空。这个时候,“From”和“To”会交换他们的角色,也就说新的“To”就是上次GC前的“From”,新的“From”就是上次GC前的To”。不管怎样,都会保证名为To的Survivor区域是空的。
- GC会一直重复这样的过程,直到“To”区被填满之后,会将所有对象移动到年老代中。
版权声明:本文为yanghenan19870513原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。