网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。
一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!
- 显式地设置 o 为 null,或者超出对象的生命周期,此时就可以回收这个对象,具体回收时机还是要看垃圾收集策略。
- 在不用对象的时候将引用赋值为 null,能够帮助垃圾回收器回收该对象。比如 ArrayList 的 clear() 方法实现:
public void clear() {
modCount++;
// clear to let GC do its work
for (int i = 0; i < size; i++)
elementData[i] = null;
size = 0;
}
2、软引用
- 功能: 描述一些还有用但非必需的对象,如果一个对象只具有软引用,则内存空间足够时,垃圾回收器就不会去回收它;如果内存空间不足时,就会回收这些对象的内存。只要GC没有回收它,该对象就可以被程序正常使用和访问。JDK1.2之后,提供了SoftReference类来实现软引用。软引用可以用来实现内存敏感的高速缓存。
- 软引用可以和一个引用队列(ReferenceQueue)联合使用,如果这个软引用所引用的对象被垃圾回收器回收,Java虚拟机就会将这个软引用加入到关联的引用队列中。
- 使用场景: 适用于网页缓存、图片缓存,防止内存溢出,在内存充足的时候,缓存对象会一直存在,在内存不足的时候,缓存对象占用的内存会被垃圾收集器回收。
图片缓存框架中,“内存缓存”中的图片是以这种引用保存,使得 JVM 在发生 OOM 之前,可以回收这部分缓存。
Browser prev = new Browser(); // 获取页面进行浏览
SoftReference sr = new SoftReference(prev); // 浏览完毕后置为软引用
if(sr.get()!=null) {
rev = (Browser) sr.get(); // 还没有被回收器回收,直接获取
} else {
prev = new Browser(); // 由于内存吃紧,所以对软引用的对象回收了
sr = new SoftReference(prev); // 重新构建
}
3、弱引用
- 功能: 也是描述还有用但非必需的对象,与软引用相比,具有弱引用的对象的生命周期更短,被弱引用关联的对象只能生存到下一次GC发生之前,垃圾回收器在扫描的时候,一旦发现只具有弱引用的对象,不管内存空间是否足够,都会回收它的内存。不过,由于垃圾回收器是一个优先级很低的线程,不一定会很快发现那些只具有弱引用的对象。JDK1.2之后,提供了WeakReference类来实现弱引用。
- 弱引用可以和一个引用队列(ReferenceQueue)联合使用,如果这个弱引用所引用的对象被垃圾回收器回收,Java虚拟机就会将这个弱引用加入到关联的引用队列中。
- 使用场景: 弱引用用于生命周期更短的,对内存更敏感的场景中,比如占用内存很大的Map,java api中就提供了WeakHashMap使用,就会使得大Map被及时清理掉。
WeakHashMap<String,Bean> weakHashMap = new WeakHashMap<>();
weakHashMap.put("a",new Bean(1));
weakHashMap.put("b",new Bean(2));
weakHashMap.put("c",new Bean(3));
System.out.println(weakHashMap);
- 在静态内部类中,经常会使用虚引用。例如:一个类发送网络请求,承担 callback 的静态内部类,则常以虚引用的方式来保存外部类的引用,当外部类需要被 JVM 回收时,不会因为网络请求没有及时回应,引起内存泄漏。
public class Main {
public static void main(String[] args) {
A a = new A();
B b = new B(a);
a = null;
System.gc();
System.out.println(b.getA()); // null
}
}
class A {}
class B {
WeakReference<A> weakReference;
public B(A a) {
weakReference = new WeakReference<>(a);
}
public A getA() {
return weakReference.get();
}
}
在上面的代码中,如果类 B 不是虚引用类 A 的话,执行 main 方法会出现内存泄漏的问题, 因为类 B 依然依赖于 A。
网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。
一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!
dn.net/topics/618658159)**
一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!