强引用
在Java中,最多的就是强引用,垃圾回收时宁愿内存不足也不会回收掉强引用的对象,一般是通过 new 方式创建的强引用。
注意这里指的垃圾回收是指在方法即在栈帧运行期间时发生的垃圾回收,此时强引用不会被回收,如果是方法运行结束即栈帧结束,此时这个方法的不管什么对象都一定要被回收的!
强引用存在的问题:
当内存不足时,由于不会回收强引用的对象,此时如果对于程序来说对象不被使用,此时强引用对象就会占相当一大部分堆的空间。
解决方法:
将强引用对象置为 null ,脱离强引用即可,ArrayList的clear() 方法的原理就是将元素置为null来做清除工作。
软引用
软引用用来描述一些有用但不是非必须的对象,用 SoftReferebce
表示,对于软引用关联的对象,只有内存不足时JVM才会回收该对象,所以该引用适合作为缓存,当内存足够时,就可以利用缓存储存查询,当内存不足时,就可以将缓存删除回收掉,这是典型的以空间换时间的。
弱引用
相对于强引用和软引用来说,弱引用的强度就更小了,当JVM进行回收时,无论内存是否充足都会回收该引用的对象,弱引用用WeakReference表示。
例子
A a = new A();
B b = new B();
此时a和b都是强引用,JVM不会回收两个对象。
A a = new A();
B b = new B();
a = null;
b = null;
当我们把他们都置为null后,他们就和强引用脱离了关系,此时JVM会对a和b的堆中的空间进行垃圾回收。
A a = new A