由前面可知程序计数器、栈、本地方法区都是随线程而生,随线程而灭,所以不需要考虑内存回收。
判断对象是否存活:
1、引用计数器:很难解决对象之间的相互循环引用。
2、可达性分析:可作为GC Roots对象的有:1、虚拟机栈中引用的对象2、方法区中类静态属性引用的对象3、方法区中常量引用的对象4、本地方法栈中JNI(即一般说的Native方法)
引用:强引用、软引用、弱引用、虚引用。
强引用:只要强引用还在,垃圾收集器不会回收被引用的对象。
软引用:在系统将要发生内存溢出异常之前,将会把这些对象列进回收范围之中进行二次回收
弱引用:被弱引用关联的对象只能存活到下一次垃圾收集发生之前,当垃圾回收器工作时,无论内存是否足够,都会回收。
虚引用:一个对象是否有虚引用的存在,完全不会对其生存时间构成影响,也无法通过虚引用来取得一个对象实例。唯一目的就是能在这个对象被收集器回收时收到一个系统通知。
回收方法区垃圾:回收废弃常量和无用的类。
判定无用类要同时满足3个条件:1、该类的所有实例已经被回收2、加载该类的classLoader已经被回收3、该类对应的java.lang.class对象没有在任何地方被引用,无法在任何地方通过反射访问该类的方法。
垃圾收集算法
1、标记-清除算法
2、复制算法:一般用于回收新生代
3、标记整理:
4、分代收集算法:在新生代使用复制算法,老年代使用标记-清除或标记-整理算法。
垃圾收集器:
Serial收集器:是一个单线程收集器,它进行垃圾收集时,必须暂停其他所有的工作线程,直到它收集结束。他是运行在Client模式下的默认新生代收集器。
ParNew收集器:是Serial收集器的多线程版本。是运行在Server模式下的虚拟机首选的新生代收集器。
Paraller Scavenge 收集器:目的是为了达到一个可控的吞吐量。也称为“吞吐量优先”收集器
Serial Old收集器:是Serial收集器的老年代版本,同样是一个单线程收集器。
Paraller Old收集器:是Paraller Scavenge的老年代版本,使用多线程和“标记-整理”算法。
CMS收集器:是一种以获得最短回收停顿时间为目标的收集器。分为4个步骤:初始标记、并发标记、重新标记、并发清除。
G1收集器:特点:并发与并行、分代收集、空间整合、可预测的停顿。