强软弱虚引用,只有体会过了,才能记住
CodeBear 人气:0
以前学习强软弱虚引用的时候,只是走马观花看看博客,并没有自己写代码去实践、去证明,导致每次看完后,过不了多久就忘了,后来下定决心,一定要自己敲敲代码,这样才能让印象更加深刻,古人云:纸上得来终觉浅,绝知此事要躬行。
### Java中的四种引用
Java中有四种引用类型:强引用、软引用、弱引用、虚引用。
### Java为什么要设计这四种引用
Java的内存分配和内存回收,都不需要程序员负责,都是由伟大的JVM去负责,一个对象是否可以被回收,主要看是否有引用指向此对象,说的专业点,叫可达性分析。
Java设计这四种引用的主要目的有两个:
1. 可以让程序员通过代码的方式来决定某个对象的生命周期;
2. 有利用垃圾回收。
### 强引用
强引用是最普遍的一种引用,我们写的代码,99.9999%都是强引用:
```
Object o = new Object();
```
这种就是强引用了,是不是在代码中随处可见,最亲切。
只要某个对象有强引用与之关联,这个对象永远不会被回收,即使内存不足,JVM宁愿抛出OOM,也不会去回收。
那么什么时候才可以被回收呢?当强引用和对象之间的关联被中断了,就可以被回收了。
我们可以手动把关联给中断了,方法也特别简单:
```
o = null;
```
我们可以手动调用GC,看看如果强引用和对象之间的关联被中断了,资源会不会被回收,为了更方便、更清楚的观察到回收的情况,我们需要新写一个类,然后重写finalize方法,下面我们来进行这个实验:
```
public class Student {
@Override
protected void finalize() throws Throwable {
System.out.println("Student 被回收了");
}
}
```
```
public static void main(String[] args) {
Student student = new Student();
student = null;
System.gc();
}
```
运行结果:
```
Student 被回收了
```
可以很清楚的看到资源被回收了。
*当然,在实际开发中,千万不要重写finalize方法*
在实际的开发中,看到有一些对象被手动赋值为NULL,很大可能就是为了“特意提醒”JVM这块资源可以进行垃圾回收了。
### 软引用
下面先来看看如何创建一个软引用:
```
SoftReference
加载全部内容