美文网首页Android
强软弱虚四大强者

强软弱虚四大强者

作者: 码农修行之路 | 来源:发表于2020-11-26 22:30 被阅读0次
    接下来体验一下四大强者的精神所在:
    • 强引用:使用最普遍的引用,一旦一个对象具有强引用,那么垃圾回收器绝不会回收它,当内存空间不足时,java虚拟机宁愿抛出OutOfMemoryError(),也不愿意回收具有强引用的对象释放内存解决内存不足的问题

    特点:

    1. 只要有强引用指向一个对象,垃圾回收器就不会回收这个对象
    2. 显式地设置0或者null,或者超出对象的生命周期,此时就可以回收这个对象,具体的回收时机还要看垃圾回收策略
    3. 在不用对象的时候将其赋值为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)会回收该对象,任何时候都有可能被回收,一般用来跟踪对象被垃圾回收的活动,监听回收情况并可以打印回收日志

    相关文章

      网友评论

        本文标题:强软弱虚四大强者

        本文链接:https://www.haomeiwen.com/subject/fqftwktx.html