4.2 复制算法
复制算法的思想是,把内存分成两块,假设分成A、B两个区域吧。
每次对象过来之后,都放到A区域里,当A区域满了之后,把存活的对象复制到B区域,然后清空A区域。
接下来的对象就全部放到B区域,等B区域满了,就把存活对象复制到A区域,然后清空B区域。
就这样来回倒腾,完成垃圾回收。
优点是不会有空间碎片,缺点是每次只用得到一半内存。
缺点是在对象存活率较高的场景下(比如老年代那样的环境),需要复制的东西太多,效率会下降。
- GC 是什么? 为什么要有 GC?
GC就是垃圾回收,释放掉没用的对象占用的空间,保证内存空间不被迅速耗尽。 - 简单说一下java的垃圾回收机制。
java采用分代回收,分为年轻代、老年代、永久代。年轻代又分为E区、S1区、S2区。
到jdk1.8,永久代被元空间取代了。
年轻代都使用复制算法,老年代的收集算法看具体用什么收集器。默认是PS收集器,采用标记-整理算法。 - JVM的常见垃圾回收算法有哪些?
复制、标记清除、标记整理、分代回收 - 为什么要使用分代回收机制?
因为没有一种算法能适用所有场合。在对象存活率低的场景下,复制算法最合适。
对象存活率高时,标记清除或者标记整理算法最合适。
所以才需要分代来处理。 - 如何判断一个对象是否存活?
现在主流使用的都是可达性分析法。从GC Roots对象计算引用链,能链上的就是存活的。 - 如果对象的引用被置为 null,垃圾收集器是否会立即释放对象占用的内存?
不会。对象回收需要一个过程,这个过程中对象还能复活。而且垃圾回收具有不确定性,指不定什么时候开始回收。