zoukankan      html  css  js  c++  java
  • Java中的四种引用类型(精简)

    话不多说奔主题,精神抖擞就是干!

    1. 在JDK1.2之后引入了强、软、弱、虚引用这四个概念。

    2. 强引用

    Object obj = new Object();

    这个obj就是"="式后面那个对象的强引用,也是我们常用的引用。

    *要点:在任何时候都不会被JVM GC回收掉,在JVM内存溢出后直接OOM。

    3. 软引用

    用途:对于可能会被经常访问到的数据采用软引用,提高查询效率,但是如果不需要的时候又需要GC主动去回收掉。

    Object obj = new Object();

    SoftRefence<Object> sr = new SoftRefence<>(obj);

    obj = null;

    obj = sr.get();  //返回这个对象的强引用,但有时候会返回Null

    *要点:在JVM内存快要溢出时GC回收掉。

    4. 弱引用

    相较软引用保存时间更短

    Object obj = new Object();

    WeakReference<Object> wr = new WeakReference<>(obj);

    obj = null;

    obj = wr.get();  //返回这个对象的强引用,但有时候会返回Null

    boolen eq = wr.isEnQueued();  //返回是否即将被GC回收器回收的标记

    *要点:在JVM第二次GC时回收掉。

    5. 虚引用

    Object obj = new Object();

    PhantomReference<Object> pr = new PhantomReference<>(obj);

    obj = null;

    obj = pr.get();  //永远返回Null

    boolen eq = pr.isEnQueued();  //返回是否被GC回收器回收的标记

    6. 结合引用队列使用

    软、弱、虚引用都可以结合引用队列使用,下面以软引用为例:

    Object obj = new Object();

    ReferenceQueue<Object> queue = new ReferenceQueue<>();

    SoftReference sr = new SoftReference(object, queue);  //绑定对象和引用队列

    obj = null;

    SoftReference val = null;

    while ((val = queue.poll()) != null) {

      //处理逻辑

    }

    *要点:

      强引用    对象       弱引用

    sr  --->  new SoftReference  --->  obj

    当软引用所引用的对象被GC回收掉以后,那么软引用对象本身会被加入到与它绑定引用队列中去。

    我们知道,当你引用的对象被GC回收掉以后,那你new SoftReference出来的(引用)对象本身是不是已经没有存在的价值了,

    但是它仍被你的sr强引用着,无法被GC回收掉,这个时候需要我们的程序添加处理逻辑。

    如果有学过C++的同学可能会好理解一些,他就像是指向指针的指针,在这里就是引用引用的引用。你品,你细品~

    欢迎看官儿们留言补充和指正,谢谢下次见!

  • 相关阅读:
    python分布式进程
    python协程
    python线程同步
    Linux内核-链表
    java基础-003
    java基础-002
    JVM-class文件完全解析-魔数
    JVM-JDK命令行工具
    JVM-类文件结构
    Linux内核-模块编译和安装
  • 原文地址:https://www.cnblogs.com/chenyixun/p/13162286.html
Copyright © 2011-2022 走看看