可达性算法中描述的对象引用,一般指的是强引用,即是GCRoot对象对普通对象有引用关系,只要这层关系存在,
普通对象就不会被回收。除了强引用之外,Java中还设计了几种其他引用方式:
⚫ 软引用
⚫ 弱引用
⚫ 虚引用
⚫ 终结器引用

1. 软引用

软引用相对于强引用是一种比较弱的引用关系,如果一个对象只有软引用关联到它,当程序内存不足时,就会将软引用中的数据进行回收。
在JDK 1.2版之后提供了SoftReference类来实现软引用,软引用常用于缓存中
JVM——几种常见的对象引用-LMLPHP
软引用的执行过程如下:

  • 1.将对象使用软引用包装起来,new SoftReference<对象类型>(对象)。
  • 2.内存不足时,虚拟机尝试进行垃圾回收。
  • 3.如果垃圾回收仍不能解决内存不足的问题,回收软引用中的对象。
  • 4.如果依然内存不足,抛出OutOfMemory异常JVM——几种常见的对象引用-LMLPHP
    软引用中的对象如果在内存不足时回收,SoftReference对象本身也需要被回收。如何知道哪些SoftReference对象需要回收呢?
    SoftReference提供了一套队列机制:
  • 1、软引用创建时,通过构造器传入引用队列
  • 2、在软引用中包含的对象被回收时,该软引用对象会被放入引用队列
  • 3、通过代码遍历引用队列,将SoftReference的强引用删除

JVM——几种常见的对象引用-LMLPHP

软引用的使用场景-缓存

软引用也可以使用继承自SoftReference类的方式来实现,StudentRef类就是一个软引用对象。通过构造器传入软引用包含的对象,以及引用队列。JVM——几种常见的对象引用-LMLPHP
使用软引用实现学生数据的缓存:JVM——几种常见的对象引用-LMLPHP
软引用如果被回收,要清理HashMap中的key。

2.弱引用

弱引用的整体机制和软引用基本一致,区别在于弱引用包含的对象在垃圾回收时,不管内存够不够都会直接被回收。在JDK 1.2版之后提供WeakReference类来实现弱引用,弱引用主要在ThreadLocal中使用。

弱引用对象本身也可以使用引用队列进行回收。JVM——几种常见的对象引用-LMLPHP

3.虚引用和终结器引用

11-27 22:44