确定对象已废弃需要两步:
- 利用可达性分析算法(与GC roots有关联——虚拟机栈中的对象,方法区静态对象,方法区常量对象,本地方法引用的对象)判断是否需要回收。
- 是否覆盖过finalize方法并执行:覆盖过可以“免死一次”。
引用的概念:
- 强引用(Strong Reference):通常我们通过new来创建一个新对象时返回的引用就是一个强引用,若一个对象通过一系列强引用可到达,它就是强可达的(strongly reachable),那么它就不被回收
- 软引用(Soft Reference):软引用可达的对象在内存不充足时才会被回收,因此软引用要比弱引用“强”一些
- 弱引用(Weak Reference):若一个对象是弱引用可达,下一次垃圾回收时无论当前内存是否充足它都会被回收
- 虚引用(Phantom Reference):虚引用是Java中最弱的引用,那么它弱到什么程度呢?它是如此脆弱以至于我们通过虚引用甚至无法获取到被引用的对象,虚引用存在的唯一作用就是当它指向的对象被回收后,虚引用本身会被加入到引用队列中,用作记录它指向的对象已被销毁。 (销毁时发送一个通知)
垃圾回收算法:
- 标记-清除算法:把标记过的清除。
- 复制算法:回收时把标记的复制一份,然后其他内存全部清除。
- 标记-整理算法:把标记过的清除后整理。
- 分代收集算法:分新生代与老年代选择回收算法——新生少量存活代使用复制,老年代对象存活率高6使用标记-清除(整理)。
虚拟机提供了多种不同的垃圾收集器与调节参数