垃圾回收

4.2 复制算法

复制算法的思想是,把内存分成两块,假设分成A、B两个区域吧。

每次对象过来之后,都放到A区域里,当A区域满了之后,把存活的对象复制到B区域,然后清空A区域。

接下来的对象就全部放到B区域,等B区域满了,就把存活对象复制到A区域,然后清空B区域。

就这样来回倒腾,完成垃圾回收。

优点是不会有空间碎片,缺点是每次只用得到一半内存。

缺点是在对象存活率较高的场景下(比如老年代那样的环境),需要复制的东西太多,效率会下降。

    1. GC 是什么? 为什么要有 GC?
      GC就是垃圾回收,释放掉没用的对象占用的空间,保证内存空间不被迅速耗尽。
    2. 简单说一下java的垃圾回收机制。
      java采用分代回收,分为年轻代、老年代、永久代。年轻代又分为E区、S1区、S2区。
      到jdk1.8,永久代被元空间取代了。
      年轻代都使用复制算法,老年代的收集算法看具体用什么收集器。默认是PS收集器,采用标记-整理算法。
    3. JVM的常见垃圾回收算法有哪些?
      复制、标记清除、标记整理、分代回收
    4. 为什么要使用分代回收机制?
      因为没有一种算法能适用所有场合。在对象存活率低的场景下,复制算法最合适。
      对象存活率高时,标记清除或者标记整理算法最合适。
      所以才需要分代来处理。
    5. 如何判断一个对象是否存活?
      现在主流使用的都是可达性分析法。从GC Roots对象计算引用链,能链上的就是存活的。
    6. 如果对象的引用被置为 null,垃圾收集器是否会立即释放对象占用的内存?
      不会。对象回收需要一个过程,这个过程中对象还能复活。而且垃圾回收具有不确定性,指不定什么时候开始回收。
原文地址:https://www.cnblogs.com/chenminghui/p/13389212.html