- 通过可达性分析该对象到GC Root不可达,如果不可达会进行第一次标记
- 已经丧失“自救”机会,如果没有自救机会,会进行第二次标记,此时对象可回收
- 代码中某一方法中的局部变量
- 类变量(静态变量)
- 常量
- 本地方法栈中引用的对象
- 已启动且未停止的线程
覆写了Object的finalize()方法,且GC还没有执行该对象的finalize()方法
当GC判定某一对象不再通过任一形式被引用时,GC会调用该对象的finalize方法。方法执行时,可以进行任何操作,包括将这个对象再次赋值给某一变量引用,但其主要目的还是做一些对象的清除操作。
其实在finalize方法中,只要将这个对象的引用(this)再次赋值给某一变量,这个对象就可以"自救"。
- 强引用:任何时候都不会被回收,宁愿OOM也不会回收
- 软引用:当JVM堆空间不足时,会被回收
- 弱引用:GC时,只要发现弱引用对象,就会被回收
- 虚引用:几乎和没有一样,随时可以被回收