强软弱虚四大强者
2020-11-26 本文已影响0人
码农修行之路
接下来体验一下四大强者的精神所在:
- 强引用:使用最普遍的引用,一旦一个对象具有强引用,那么垃圾回收器绝不会回收它,当内存空间不足时,java虚拟机宁愿抛出OutOfMemoryError(),也不愿意回收具有强引用的对象释放内存解决内存不足的问题
特点:
- 只要有强引用指向一个对象,垃圾回收器就不会回收这个对象
- 显式地设置0或者null,或者超出对象的生命周期,此时就可以回收这个对象,具体的回收时机还要看垃圾回收策略
- 在不用对象的时候将其赋值为null,能够帮助垃圾回收器回收对象,比如集合claer()
- 软引用:内存足够时,垃圾回收器不会回收它,如内存不足时,垃圾回收器就会回收这个对象
使用场景:图片缓存、网页缓存
图片缓存框架中,“内存缓存”中的图片是这种引用保存,使得JVM在发生oom之前,可以回收这部分缓存
- 弱引用:将对象留在内存的能力不是那么强的引用,当垃圾回收器扫描到只具有弱引用的对象,不管当前内存是否足够,都会回收内存
使用场景:静态内部类中,经常会使用弱引用,例如:一个类发送网络请求,承担callback的静态内部类,常用弱引用的方式来保存外部类的引用,当外部类需要被回收时,不会因网络请求没有及时回应,而引起内存泄漏
- 虚引用:不会决定对象的生命周期,如果一个对象只有虚引用,那么它就和没有任何引用一样,在任何时候都可能被垃圾回收器回收
使用场景:可以用来跟踪对象被垃圾回收的活动
注意:区别于弱引用和软引用:虚引用必须和引用队列(ReferenceQueue)联合使用,当垃圾回收器准备回收一个对象时,如果发现它还有虚引用,就会在回收对象的内存之前,把这个虚引用添加到与之关联的引用队列中
Object obj = new Object();
ReferenceQueue refQueue = new ReferenceQueue();
PhantomReference<Object> phantom = new PhantomReference<Object>(obj, refQueue);
- 强引用:(GC)垃圾回收不到,即使内存空间不足的时候,jvm宁愿抛出oom,也不会回收,一般会造成内存泄漏,所以在对象不使用的时候可以置为null,帮助GC去进行回收,比如集合clear()
- 软引用:(GC)垃圾回收不到,只有内存不够用的时候,也就是在oom之前,就会被回收释放,一般在内存保存图片,图片缓存机制中就用到软引用,方便高效的从内存中读取,快速的展示,如果内训不足时,会主动释放回收
- 弱引用:(GC)会回收该对象,只要垃圾回收扫描到该引用,不管当前内存是否足够,都会被释放回收,常用与内部类持有外部类引用的时候,此时会经常把外部引用放到弱引用中,这样避免内存泄漏
- 虚引用:(GC)会回收该对象,任何时候都有可能被回收,一般用来跟踪对象被垃圾回收的活动,监听回收情况并可以打印回收日志