可达性分析
GC Roots :
虚拟机栈(栈帧中的本地变量表)中引用的对象
方法区中类静态属性引用的对象。
方法区中常量引用的对象。
本地方法栈中 JNI (即一般说的 Native 方法)引用的对象
引用的几种方式
强引用:有引用不回收
软引用: 内存溢出前回收
弱引用:无论当前内存是否足够,都会回收掉只被弱引用关联的对象
虚引用:唯一目的就是能在这个对象被收集器回收时收到一个系统通知
将这个虚引用加入引用队列,在其关联的虚引用出队前,不会彻底销毁该对象。 所以可以通过检查引用队列中是否有相应的虚引用来判断对象是否已经被回收了。
如果一个对象没有强引用和软引用,对于垃圾回收器而言便是可以被清除的,在清除之前,会调用其finalize方法,如果一个对象已经被调用过finalize方法但是还没有被释放,它就变成了一个虚可达对象。
垃圾收集算法
1、标记-清除算法
不足:1:效率低2:空间碎片
2:复制算法(新生代)
Eden:from:to=8:1:1,存活的对象移到to区
3:标记-整理算法(老年代)
老年代:
4:G1 jdk9:一个横跨新生代和老年代的垃圾回收器。实际上,它已经打乱了前面所说的堆结构,直接将堆分成极其多个区域。每个区域都可以充当 Eden 区、Survivor 区或者老年代中的一个。它采用的是标记 - 压缩算法,而且和 CMS 一样都能够在应用程序运行过程中并发地进行垃圾回收。将内存上的空洞压缩
5:jdk8之前 CMS 采用的是标记 - 清除算法,并且是并发的。