如何确定垃圾回收

引用计数算法

给使用的每个对象添加一个计数器,每次引用,计数器加1,失去引用,计数器减1,那么当计数器一段时间保持为0的时候,我们认为这个对象就可以被回收 缺点:当两个对象相互引用的时候,由于是两个对象彼此相互引用,已经没有其他引用存在,此时计数器都是1,但是并不会被回收

可达性分析算法

程序把我们所有的引用关系看作一张图,从一个节点的GC ROOT开始分析引用,找到引用,然后继续寻找该引用节点的引用,直到找到所有的引用,那么没有被引用的节点,就是无用的节点

目前Java中可作为GC ROOT的对象
  • java虚拟机栈中的引用的对象
  • 方法区中的类静态属性引用的对象。 (一般指被static修饰的对象,加载类的时候就加载到内存中)
  • 方法区中的常量引用的对象
  • 本地方法栈中的JNI(native方法)引用的对象

GC处理垃圾算法

标记-清除

分为标记和清除两个阶段处理内存中的对象,效率不高

复制算法

将可用内存按照容量分为大小相同的两块,使用的时候只使用其中一块区域,当该区域内存满了的时候,就将该块内容中活着的对象复制到另外一块容量区域,然后清理之前用过的那块内存空间,彼此交换两块内存区,完成垃圾收集

标记-整理(标记-压缩)

在标记-清除的基础上进行优化,将活着的对象压缩到内存的一端,然后清理除该端边界之外的内存区域

分区算法

将整个内存空间分为N个连续不同的内存区域,每个单独使用,独立回收,小颗粒度控制

GC算法优略评估

吞度量(Throughput),吞吐量越大越好 停顿时间(pasue time),暂停时间越短越好