垃圾回收器与内存回收策略
对象已死?
-
引用计数算法
给对象加一个计数器,引用一次计数器加1,引用失效时,计数器减1。任意时刻,计数器为0 的对象不再被使用。Java中没有使用此方式,此方式无法解决对象间相互循环引用的情况。
-
根搜索算法
以GC roots 为根节点,向下搜索,搜所走过的路径成为引用链。当一个对象到GC roots没有人任何引用链相连(GC roots 导致个对象不可达),证明此对象是不可用的。
Java中可作为GC roots的对象包括以下几种:
-
虚拟机栈(栈帧中的本地变量表)中的而引用的对象
-
方法区中类静态属性引用的对象
-
方法区中常量引用的对象
-
本地方法栈中native方法引用的对象
-
-
引用
-
强引用
类似 A a = new A();
强引用还在,不会回收被引用的对象。
-
软引用
还有用但非必须的对象。系统在发生内存溢出之前,会将这些对象列进回收范围,进行二次回收,
回收完还是内存不足,才会抛出内存溢出异常。
通过SoftReference关联软引用
-
弱引用
被弱引用关联的对象只能生存到下一次垃圾收集之前。通过WeakReference关联软引用。
-
虚引用
虚引用不影响垃圾收集,也不能通过虚引用获取对象。
给对象设置虚引用关联唯一目的是希望对象被回收时收到一个系统通知。
-
-
对象生死
回收前至少经历两次标记
当对象与GC roots之间无引用链时,会比标记并筛选,筛选条件是是否需要执行finalize()方法。
当对象没有覆盖finalize()方法或者已经执行过一次后,不会执行。
执行finalize()方法后重新获得引用链后会在第二次进行标记时移除标记。
-
回收方法区
-
废弃常量
不存在引用的常量
-
无用的类
所有实例已被回收
加载该类的classloader已被回收
该类对应的java.lang.Class对象没有在让你和地方被引用,无法在任何地方通过反射访问该类的方法。
-
垃圾收集算法
- 标记清楚算法
- 复制算法
- 标记整理
- 分代收集
垃圾收集器
-
serial收集器
-
parnew收集器
-
parallel scavenge收集器
-
serial old 收集器
-
parallel old收集器
-
CMS 收集器
-
G1收集器
网友评论