4.2Java垃圾回收机制(Garbage Collection)

4.2Java垃圾回收机制(Garbage Collection)

Java垃圾回收机制与C++垃圾回收机制的对比

C++程序员不仅要关注业务逻辑还要关注内存管理

C++垃圾回收

特点:

类比饭店:

  • 自己吃饭自己擦桌子

Java垃圾回收

类比饭店:

  • 请一个服务员(JVM),专门擦桌子

Java垃圾回收过程
  • 发现无用对象---如何发现无用对象是个重点

    • 引用计数法

      • 原理如图:

      • 4.2Java垃圾回收机制(Garbage Collection)

      • 每个对象加一个引用,被引用一次计数+1,通过对象是否被引用判断对象是否是垃圾

      • 缺点

        • 遇见循环引用就会出现问题

        • 实例题:

        • /**
          * 垃圾回收算法循环引用机制
          * @author Lucifer
          */
          public class StudentNo3 {
             //定义一个成员变量
             String name;
             //
             StudentNo3 friend;

             public static void main(String[] args) {
                 StudentNo3 s1 = new StudentNo3();
                 StudentNo3 s2 = new StudentNo3();

                 s1.friend = s2;
                 s2.friend = s1;
                 s1 = null;
                 s2 = null;
                 //System.gc(); //向系统发出了一个请求,能否调GC,至于调用还是不调用由系统决定
            }
          }
        • 示例图:

        • 4.2Java垃圾回收机制(Garbage Collection)

    • 引用可达法(根搜索算法)

      • 用算法跟踪节点

  • 回收无用对象占用的内存空间

通用的分代垃圾回收机制

本质:将对象进行分类,不同对象的生命周期是不一样的

  • 年轻代(Eden Survivor)

  • 年老代(Tenured/Old)

  • 持久代


年轻代(Eden Survivor)

特点:

  • 新生成的对象首先都是放在Eden区

目标:

  • 尽可能快速的收集掉那些生命周期短的对象

  • Eden满了以后触发Minor GC会清理年轻代的内存---算法过一遍所有的对象,无用的清除掉,算法采用效率较高的复制算法---有用的就复制到Survivor区(1区或者2区,对象再次满了以后查Survivor1区的,有用的放到Survivor2区,无用的清除,Eden里面有用的放到Survivor1区,无用的清除。当一个对象在Survivor1区2区反复横跳到15次以后放入Tenured/Old年老区。效率高但是会浪费内存空间。

  • 年轻代区域存放满对象后会将对象放到年老代区域

年老代(Tenured/Old)

特点:

  • 在年轻代中经理了N(默认15)次垃圾回收后仍然存活的对象

  • 生命周期长

  • 数量多的时候要启动Major GC和Full GC(全量回收)---代价很高,性能消耗很高,全面清理年轻代区域和年老代区域对象

持久代

特点:

  • 存放静态文件,Java类、方法等。

  • 持久代堆垃圾回收没有显著影响

  • 对象在它就在

示例图:

4.2Java垃圾回收机制(Garbage Collection)

4.2Java垃圾回收机制(Garbage Collection)

JVM调节

主要关注:

 4.2Java垃圾回收机制(Garbage Collection)

上一篇:深入JVM学习


下一篇:UJAM Beatmaker EDEN for Mac(舞曲电子鼓)