您当前的位置: 首页 >  Java

韩曙亮

暂无认证

  • 2浏览

    0关注

    1068博文

    0收益

  • 0浏览

    0点赞

    0打赏

    0留言

私信
关注
热门博文

【Android 内存优化】Java 引用类型 ( 强引用 | 软引用 | 弱引用 | 虚引用 )

韩曙亮 发布时间:2020-06-25 12:27:30 ,浏览量:2

文章目录
  • 一、 Java 引用类型 ( 强、软、弱、虚 )
  • 二、 软引用代码示例
  • 三、 弱引用代码示例

强引用 ( 不回收 ) > 软引用 ( OOM 前回收 ) > 弱引用 ( GC 必回收 ) > 虚引用 ( 回收前通知 )

如果单纯的想避免 OOM , 可以使用软引用 ;

如果对性能要求很高 , 要最大限度节省内存 , 所有的内存回收都要及时处理 , 就使用弱引用 ;

内存泄漏原理 : 长生命周期对象 , 持有短生命周期对象的引用 , 并且是强引用持有 , GC 无法释放该短生命周期对象引用 , 造成 OOM ;

一、 Java 引用类型 ( 强、软、弱、虚 )

1. 引用 :

① 变量引用 : 创建对象 , 将对象赋值给变量 V V V , 那么变量 V V V 就是对象的引用 ;

② 对象引用 : 对象 A A A 可以调用对象 B B B , 那么对象 A A A 持有对象 B B B 的引用 ;

2. 引用类型 : GC 垃圾回收机制 与 引用类型 密切相关 ;

① 强引用 : 最普遍的引用 , Object object = new Object() , 这就是强引用 ;

② 软引用 : 用于定义一些有用 , 但不是必须的对象 , 对象被软引用引用 , 当系统内存严重不足 , 在报出 OutOfMemoryError 错误之前就会将软件用释放掉 , 如果将软引用释放掉之后 , 还是内存不足 , 就会报 OutOfMemoryError 异常 ;

③ 弱引用 : 弱引用也是描述非必须对象 , 该引用的引用强度比软引用更弱 , 该引用对象 , 生命周期只到下一次 GC 回收之前 , GC 只要扫描到了弱引用 , 直接回收 , 即使内存足够 , 也要回收该对象所占用的内存 ;

④ 虚引用 : 虚引用无法获得被引用的对象 , 其唯一的作用是对象被回收时 , 可以得到相应的通知 ; 虚引用不会对对象的生存周期造成影响任何 , GC 忽略虚引用 , 即使有虚引用引用某对象 , GC 会当做该引用不存在 ; 开发时不常用 , 一般开发底层 SDK , 或监测系统运行类的软件时 , 才使用 ;

强引用 ( 不回收 ) > 软引用 ( OOM 前回收 ) > 弱引用 ( GC 必回收 ) > 虚引用 ( 回收前通知 )

二、 软引用代码示例

1. 软引用创建 :

① 直接创建软引用 : 在软件用构造函数中创建一个软引用 , 不涉及外部引用 ;

SoftReference softReference3 = new SoftReference(new Object());

② 传入创建好的对象引用创建软引用 : 软引用是通过在 软引用构造函数 传入引用对象创建的 , 首先要创建引用对象 ; 下面的强引用可以在创建软引用完毕后置空解除引用 , 否则肯定不能被回收 ;

Object softObject = new Object();
SoftReference softReference1 = new SoftReference(softObject);

③ 创建软引用并设置引用队列 : 在上述基础上 , 可以在构造函数中设置一个引用队列参数 ;

Object softObject = new Object();
// 引用队列
ReferenceQueue referenceQueue = new ReferenceQueue();
// 创建软引用, 并将该软引用引用放入引用队列中
SoftReference softReference2 = new SoftReference(softObject, referenceQueue);

④ 上述软引用释放 : 创建的软引用在两种情况下才会释放 :

  • 软引用置空 : GC Root 不可达时回收 ;
  • 内存不足 : 内存不足 , OOM 之前回收 ;

2. 软引用代码示例 :

import java.lang.ref.ReferenceQueue;
import java.lang.ref.SoftReference;

public class Main {

    public static void main(String[] args) throws InterruptedException {

        /*
            软引用示例
            1. 创建软引用 : public SoftReference(T referent)
            2. 创建软引用并放入引用队列中 :
                public SoftReference(T referent, ReferenceQueue            
关注
打赏
1663594092
查看更多评论
0.0439s