Java引用的简易理解的总结

本文主要介绍如何如何理解Java的四种引用.
这四种引用的文章已经很多了,但是大部分的文章都不太只管,本文提供了易理解的表达.

进程内存不足

如果JVM进程内存不足,将释放软引用的对象的内存以满足内存申请;

可达性

其他情况,当GC扫描到对象时,先判断对象的可达性:

如果不可达,将被直接回收

如果可达:

1
2
3
4
5
6
7
8
9
10
11
12
13
1. 有且只有强引用,不被回收

2. 有且只有弱引用,可被回收
应用场景:引用别的对象,但不希望因为自己的生命周期影响到了别的对象被回收.
例如:A对象和B对象,B需要引用A,但是,当A可以被回收而B还在持续运行不可被回收时,由于B对A是强引用,导致A无法被回收,此时,可将B对A的引用使用WeakRefrence声明

3. 有且只有软引用,不被回收
应用场景:可从其他渠道被还原的缓存池,
例如:图片缓存,放在内存中提效,内存不足时就读文件降低性能,释放内存.
redis缓存也是一个例子,当内存不足时,清除redis的缓存,使用者可直接穿透到DB读取值

4. 有且只有虚引用,被回收
应用场景:监控对象状态,强制配合引用队列(Reference Queue)的使用