强引用 | 被GC Root直接引用的对象 | 只有所有GCRoot断开引用后,才能被回收 |
软引用 | 被GCRoot间接引用的对象 | 在不被任何一个GC Root直接引用后,当一次垃圾回收后,内存仍然不足时,回收软引用对象 |
弱引用 | 被GCRoot间接引用的对象 | 在不被任何一个GC Root直接引用后,当发生垃圾回收,不管空间够不够 都会回收弱引用对象 |
虚引用 | 被GCRoot间接引用的对象 | 必须配合引用队列使用 |
终结器引用 | 被GCRoot间接引用的对象 | 必须配合引用队列使用 |
- 虚引用 必须配合引用队列使用 ,当虚引用创建时就关联一个引用队列,例如直接内存 在创建ByteBuffer的实现类对象时,会创建名为Cleaner的虚引用对象,ByteBuffer会分配一块直接内存,并把直接内存的地址传递给虚引用对象,目的是,将来ByteBuffer没有强引用被回收掉,直接内存并不能被java所管理,所以让ByteBuffer回收掉后,让虚引用cleaner进入引用队列。引用队列定时去找新入队的cleaner,如果有就调用cleanner的方法,释放直接内存。
- 终结器引用,所有的java对象都会集成Object父类,儿object父类里都有finallize()方法,当这个对象重写了finallize方法,并且没有强引用后,进行垃圾回收时,由虚拟机创建一个终结器引用,当这个对象被垃圾回收时,会把终结器引用加入到引用队列,值得注意的是,这个时候这个对象并没有立刻被垃圾回收,而是先把他的终结器引用放入引用队列,再由一个优先级很低的线程 (finallize Hanlder),在某些时期 查看是否有终结器引用,如果有,则通过终结器引用找到对象,通过调用finallize方法回收掉。