下列对JVM垃圾回收的描述,不正确的是()
A.标记清除包含标记对象和清除两次操作,所以执行效率不高
B.复制算法将内存分为两块AB,回收后将A部分所有的存活对象移动到B,将A空闲出来。这种操作解决了碎片的问题
C.标记整理是将对象标记之后,全部存活的对象向一端移动,对额外空间的要求较高
D.分代收集实际中包含的标记清除、复制等算法
正确答案是 C
C是移动算法,不是复制算法,不需要额外空间
1.标记清除
执行GC的两次标记过程,被标记的对象,将会被清除。但是随之而来又有相应的问题,算法执行的效率不高,而且重点是清除之后会产生内部碎片,如上图所示,黑色部分被回收之后,产生了一些碎片,这样在分配内存给大对象的时候,无法找到足够的内存,而又要触发收集动作。
2.复制
首先在使用时候,将内存分为两块AB,回收后将A部分所有的存活对象移动到B,将A空闲出来。这种操作解决了碎片的问题,但也暴露出相应的弊端,比如说空间的浪费,在使用的时候将储存空间一分为二,内存优势大打折扣,一次GC触发之前只能用一半内存来工作。另一个显而易见的问题就是,当对象很多的时候,逐个复制去调整位置,也是个大问题。
3.标记整理
将对象标记之后,全部存活的对象向一端移动,然后清理掉存活对象边界以外的内存。
4.分代收集
这种方法内存空间分为了 老年代和新生代,老年代的特点就是其中的对象不怎么被回收,而新生代的特点就是其中的对象要经常被回收,
在老年代,由于对象回收量较小,所以一般采用标记整理算法。在新生代,由于对象回收量较大,所以一般采用复制算法。
但是也不是说一定要付出复制算法的超高代价,因为实际应用中,一般将新生代划分为一块大的Eden和两块小的Survivor空间,每次使用一块Eden和一块Survivor,当回收时,把所有的存活对象Copy到另一块Survivor上,其余的空间全清理,然后继续使用这块Survivor和Eden来进行操作。
帖子还没人回复快来抢沙发