精华内容
下载资源
问答
  • Java引用类型

    千次阅读 2018-09-04 14:31:34
    Java引用类型的知识点详解。 引用类型:强引用、软引用、弱引用、虚引用 对像生命周期和可达性状态 引用队列 reachability fench(可达性栏杆) 引用类型 版本:2018/9/4-1(13:13) 引用类型 面试题 引用...

    转载请注明链接:https://blog.csdn.net/feather_wch/article/details/82383183

    Java引用类型的知识点详解。
    1. 引用类型:强引用、软引用、弱引用、虚引用
    1. 对像生命周期和可达性状态
    1. 引用队列
    1>. reachability fench(可达性栏杆)

    引用类型

    版本:2018/9/4-1(13:13)


    问题汇总

    1. 强引用、软引用、弱引用、幻想/虚引用有什么区别?具体的应用场景有哪些?
    2. 不同引用类型的体现的本质区别是什么?
    3. 强引用是什么?
    4. 什么时候具有引用的对象可以被回收?
    5. 软引用是什么?
    6. 软引用有什么用?软引用的使用场景?
    7. 弱引用是什么?
    8. 弱引用有什么用?
    9. 幻象引用/虚引用是什么?
    10. 虚引用有什么用?虚引用的使用场景?
    11. cleaner机制的特点
    12. Java中5种可达性的级别
    13. 强可达是什么?强引用状态?
    14. 软可达是什么?软引用状态?
    15. 弱可达是什么?弱引用状态?
    16. 幻象可达/虚可达是什么?幻想引用状态?
    17. 不可达状态?
    18. 有哪些方法能达到强引用效果?
    19. 【☆】Java对象会在该对象的方法执行完毕前被释放吗?何时会出现这种情况?
    20. Reference.reachabilityFence(object)方法是干什么的?
    21. 为什么需要Reachability Fence这种机制?
    22. 直接只运行这个代码会出错吗?为什么?:Executors.newSingleThreadExecutor().submit()
    23. reachabilityFence()方法的使用场景
    24. 如何使用reachabilityFence()?

    引用类型

    1、不同引用类型的体现的本质区别是什么?

    1. 体现的是对象不同的可达性状态
    2. 以及对垃圾回收的影响。

    3、强引用是什么?

    1. 常见的对象引用
    2. 只要对象有强引用,就表示该对象依然存活着。

    4、什么时候具有引用的对象可以被回收?

    1. 超过了引用的作用域
    2. 强引用 = null

    5、软引用是什么?

    1. SoftReference
    2. 相比于强引用要软一些,会去避免gc
    3. 在内存不足时,出现oom前,会将软引用对象回收。

    6、软引用有什么用?软引用的使用场景?

    1. 常用于缓存
    2. 内存足时能直接获取缓存;内存不足时会被释放。

    7、弱引用是什么?

    1. WeakReference
    2. 不能豁免GC,提供了一种没有特殊约束的关系
    3. 一个对象只有弱引用,会被直接GC。

    8、弱引用有什么用?

    1. 用于解决内存泄露

    9、幻象引用/虚引用是什么?

    1. PhantomReference
    2. 不能通过该引用来访问对象。
    3. 在对象finalize后,通过虚引用能做一些额外的工作。

    10、虚引用有什么用?虚引用的使用场景?

    1. 用于Java后来推出的Cleaner机制

    11、cleaner机制的特点

    1. 能作为清理工作的最后一道防线
    2. 没有finalize的区别
    3. 不建议去使用cleaner机制

    生命周期和可达性状态

    1、对象的生命周期以及可达性状态流程图。

    graph TD;
        1(对象创建);
        2(对象初始化);
        3(强引用状态);
        4(软引用状态);
        5(弱引用状态);
        6(finalize);
        7(幻象引用状态);
        8(unreachable);
        1-->2;
        2-->3;
        3-->4;
        3-->5;
        4-->3;
        5-->3;
        4-->5;
        6-->7;
        7-->8;
        4-->6;
        5-->6;

    2、Java中5种可达性的级别

    1. 强可达(Strong Reachable)
    2. 软可达(Soft Reachable)
    3. 弱可达(Weak Reachable)
    4. 幻象/虚可达(Phantom Reachable)
    5. 不可达(unreachable)

    3、强可达、强引用状态?

    对象有一个或者多个线程可以通过强引用就可以访问到

    4、软可达、软引用状态?

    只有通过软引用才可以访问到对象的状态

    5、弱可达、弱引用状态?

    1. 只能通过弱引用才可以访问到对象的状态
    2. 无法通过软引用或者强引用访问到的状态
    3. 弱引用一旦清除,就符合了finalize的条件

    6、幻象可达/虚可达、幻想引用状态?

    1. 没有强引用、软引用、弱引用
    2. 并且已经finalize过后,只有虚引用指向该对象。

    7、不可达状态?

    对象可以被清除了

    可达性状态的改变

    8、Reference的get方法

    1. 都是抽象类:java.lang.ref.Reference的子类
    2. 提供了get方法。
    3. 弱引用获取对象: weakReference.get()
    4. 软引用获取对象: softReference.get()
    5. 虚引用: get()无法获得原有地向,永远返回null

    9、可达性状态可以改变吗?

    可以!
    1. 通过软引用、虚引用获得对象后,重新赋予强引用,此时就强行进入到了强引用状态

    10、JVM垃圾回收会根据可达性状态进行回收

    因为可能会更改可达性状态,所以JVM会进行二次确认。

    11、为什么使用了弱引用还是出现了内存泄露?

    1. 需要检查是否错误的保持了强引用
    2. 比如赋值给static 变量

    引用队列

    1、引用队列是什么?有什么用?

    1. ReferenceQueue, 引用队列
    2. 在将各种类型的引用(如: 虚引用、弱引用、软引用)关联到对象时,可以选择是否关联引用队列
    3. JVM会在特定时间将引用加入到引用队列中(不需要我们关心)
    4. 作用:可以从队列中获取引用,并且执行后续的逻辑。

    2、幻象引用/虚引用为什么一定要使用引用队列?

    1. 虚引用在对象被finalize后,get方法只会返回null
    2. 如果不使用引用队列,会导致虚引用完全没有用了。

    3、引用队列的使用?(配合虚引用)

    Object object = new Object();
    ReferenceQueue queue = new ReferenceQueue();
    // 1. 创建虚引用。关联上引用队列。
    PhantomReference reference = new PhantomReference(object, queue);
    // 2. 去除强引用
    object = null;
    // 3. 触发GC
    System.gc();
    
    try {
        // 4. 从队列中取出对象的引用(本例中是虚引用)
        Reference ref = queue.remove(1000L);
        if(ref != null){
            // TODO somthing
            System.out.println("finalize后,进行清理工作。");
        }
    } catch (InterruptedException e) {
        e.printStackTrace();
    }

    软引用的垃圾回收

    1、软引用的垃圾回收的原理?

    1. 软引用的垃圾回收,是在内存不足时,进行回收—本质不是这样。
    2. 软引用通常是在最后一次引用后保持一段时间
    3. 保持的时间是根据堆剩余空间计算的。

    2、软引用只要内存充足就不会释放对象?

    错误!
    1. 是在最后一次引用后,保持一段时间,然后清除。

    3、如何改变软引用释放的时间

    1. 设置虚拟机参数
    2. 但是这些行为都取决于JVM的实现,不要过于依赖这些参数。
    -XX:SoftRefLRUPolicyMSPerMB = 3000 // 3秒中
    或者
    -Xmx指定的最大值

    Reachability Fence(可达性栅栏)

    1、有哪些方法能达到强引用效果?

    1. 基本引用类型
    2. 通过底层API—这就是所谓的设置Reachability Fence

    2、为什么需要Reachability Fence这种机制?

    1. 根据规范,一个对象没有强引用,则符合垃圾回收的标准。
    2. 但是!如果有的对象,没有强引用,但是部分属性还需要被使用,就会导致问题。
    3. Reachability Fence就是通过一些方法,在没有强引用时,告知JVM这些对象正在被使用,先不要进行GC。

    3、Reachability Fence应对的问题

    1. 例如:对象实例方法在执行完前,对象就已经被GC!
    2. 例如:线程池-Executors.newSingleThreadExecutor().submit()
    public static void main(String[] args) {
        for (int i = 0; i < 2000; i++) {
            newSingleThreadPool();
        }
    }
    private static void newSingleThreadPool() {
        Executors.newSingleThreadExecutor().submit(new Runnable() {
            @Override
            public void run() {
                byte[] bytes = new byte[1024 * 1024 * 4];
                System.out.println(Thread.currentThread().getName());
            }
        });
    }

    4、Executors.newSingleThreadExecutor().submit()报错

    Exception in thread "main" java.util.concurrent.RejectedExecutionException: Task java.util.concurrent.FutureTask@543c6f6d rejected from java.util.concurrent.ThreadPoolExecutor@13eb8acf[Terminated, pool size = 0, active threads = 0, queued tasks = 0, completed tasks = 0]
        at java.util.concurrent.ThreadPoolExecutor$AbortPolicy.rejectedExecution(ThreadPoolExecutor.java:2047)
        at java.util.concurrent.ThreadPoolExecutor.reject(ThreadPoolExecutor.java:823)
        at java.util.concurrent.ThreadPoolExecutor.execute(ThreadPoolExecutor.java:1369)
        at java.util.concurrent.AbstractExecutorService.submit(AbstractExecutorService.java:112)
        at java.util.concurrent.Executors$DelegatedExecutorService.submit(Executors.java:678)
        at Main.newSingleThreadPool(Main.java:32)
        at Main.main(Main.java:28)

    5、reachabilityFence()方法的使用场景

    1. JDK中常用于Excutors、HTTP2客户端等经常会异步调用的情况。

    6、如何使用reachabilityFence()?

    1-Excutor的问题:

    Executors.newSingleThreadExecutor().submit(xxx);
    // 调用这个方法,用于通知JVM,Excutor对象还不能回收
    Reference.reachabilityFence(executor);

    2-一般对象的设置

    Reference.reachabilityFence(object);

    参考资料

    1. 为什么一个对象的实例方法在执行完成之前其对象可以被GC回收?
    展开全文
  • Java 引用类型

    2017-03-31 09:41:41
    Java 引用类型分这些引用类型,使程序更加灵活的控制对象的生命周期,也方便了JVM进行垃圾回收。1.强引用Object obj=new Object();最常用的引用类型。平时new 一个对象的时候就是强引用。垃圾回收器不会回收强引用...

    Java 引用类型

    分这些引用类型,使程序更加灵活的控制对象的生命周期,也方便了JVM进行垃圾回收。

    1.强引用

    Object obj=new Object();

    最常用的引用类型。平时new 一个对象的时候就是强引用。垃圾回收器不会回收强引用对象,即使内存空间不足,JVM会抛出异常。

    2.软引用

    Object obj=new Object();
    SoftReference<Object> sf=new SoftReference<Object>(obj);//建立软连接
    obj=null;
    sf.get();//获取对象

    软引用需要用SoftReference指明。软引用主要实现类似缓存的功能,在内存足够的情况下通过软引用取值,无需从繁忙的真实来源查询数据,提升速度;当内存不够的时候,JVM会回收这部分空间,来解决空间不足的问题。

    3.弱引用

    Object obj=new Object();
    WeakReference<Object> wf=new WeakReference<Object>(obj);
    obj=null;
    wf.get();//有时返回空
    wf.isEnqueued();

    在进行第二次垃圾回收的时候,回收。弱引用主要用于监控对象是否已经被垃圾回收器标记为即将回收的垃圾,可以通过弱引用的isEnQueued()方法返回对象是否被标记。

    4.虚引用

    Object obj=new Object();
    PhantomReference<Object> pf=new PhantomReference<Object>(obj);
    obj=null;
    pf.get();//永远为null
    pf.isEnqueued();

    最弱的一种引用关系。一个对象是否有虚引用存在,完全不会对其生存时间构成影响,也无法通过虚引用来取得一个对象的实例。为 一个对象设置虚引用关联的唯一目的是希望能在这个对象被收集器回收时收到一个系统通知。主要用于检测对象是否已经被删除。

    展开全文
  • java引用类型

    2011-07-14 12:15:01
    http://wenku.baidu.com/view/3fc341737fd5360cba1adb60.htmljava引用类型必须用new才算是分配了数据空间。 引用类型数据是指 ,数据类型 在堆内存中创建的数据,而你拿到的是这个数据的引用。 java中除了 int,do
    展开全文
  • Java引用类型有哪些

    万次阅读 2019-07-05 16:48:32
    其中,引用数据类型在存储堆中对需要引用的对象进行引用,引用是Java面向对象的一个特点,在Java入门中,我们会接触到四种Java的引用类型,接下来就说说这四种Java引用类型有哪些吧: 1、Java中有哪几种引用?...

     

    动力节点Java培训最新上线Java实验班,等你来测试自己适不适合学习Java编程哦!

     

    Java类型一般有两种,即基本数据类型与引用数据类型。其中,引用数据类型在存储堆中对需要引用的对象进行引用,引用是Java面向对象的一个特点,在Java入门中,我们会接触到四种Java的引用类型,接下来就说说这四种Java引用类型有哪些吧:

     

     

    1、Java中有哪几种引用?它们的含义和区别是什么?

     

      从JDK1.2开始,Java中的引用类型分为四种,分别是:

     

    ①强引用(StrongReference)

     

    ②软引用(SoftRefernce)

     

    ③弱引用(WeakReference)

     

    ④虚引用(PhantomReference)

     

      强引用-StrongReference

     

      这种引用是平时开发中最常用的,例如Stringstrong=newString("StrongReference"),当一个实例对象具有强引用时,垃圾回收器不会回收该对象,当内存不足时,宁愿抛出OutOfMemeryError异常也不会通过回收强引用的对象,因为JVM认为强引用的对象是用户正在使用的对象,它无法分辨出到底该回收哪个,强行回收有可能导致系统严重错误。

     

      软引用-SoftReference

     

      如果一个对象只有软引用,那么只有当内存不足时,JVM才会去回收该对象,其他情况不会回收。软引用可以结合ReferenceQueue来使用,当由于系统内存不足,导致软引用的对象被回收了,JVM会把这个软引用加入到与之相关联的ReferenceQueue中。

     

    ReferenceQueuereferenceQueue=newReferenceQueue();

     

    SoftReference<Book>softReference=newSoftReference<>(newBook(),referenceQueue);

     

    Bookbook=softReference.get();

     

    Referencereference=referenceQueue.poll();

     

      当系统内存不足时,触发gc,这个Book就会被回收,reference将不为null。

     

      弱引用-WeakReference

     

      只有弱引用的对象,当JVM触发gc时,就会回收该对象。与软引用不同的是,不管是否内存不足,弱引用都会被回收。弱引用可以结合ReferenceQueue来使用,当由于系统触发gc,导致软引用的对象被回收了,JVM会把这个弱引用加入到与之相关联的ReferenceQueue中,不过由于垃圾收集器线程的优先级很低,所以弱引用不一定会被很快回收。下面通过一个主动触发gc的例子来验证此结论。

     

    ReferenceQueuereferenceQueue=newReferenceQueue();

     

    WeakReference<Book>weakReference=newWeakReference(newBook(),referenceQueue);

     

    Bookbook=softReference.get();

     

    System.gc();

     

    //Runtime.getRuntime().gc();

     

    Referencereference=referenceQueue.poll();

     

      当然这不是每次都能复现,因为我们调用System.gc()只是告诉JVM该回收垃圾了,但是它什么时候做还是不一定的,但就我测试来看,只要多写几次System.gc(),复现的概率还是很高的。

     

      虚引用-PhantomReference

     

      如果一个对象只有虚引用在引用它,垃圾回收器是可以在任意时候对其进行回收的,虚引用主要用来跟踪对象被垃圾回收器回收的活动,当被回收时,JVM会把这个弱引用加入到与之相关联的ReferenceQueue中。与软引用和弱引用不同的是,虚引用必须有一个与之关联的ReferenceQueue,通过phantomReference.get()得到的值为null,试想一下,如果没有ReferenceQueue与之关联还有什么存在的价值呢?

     

    PhantomReference<Book>phantomReference=newPhantomReference<>(newBook(),referenceQueue);

     

    Bookbook=phantomReference.get();//此值为null

     

    Referencereference=referenceQueue.poll();

     

     

    展开全文
  • Java引用类型与常量

    千次阅读 2017-01-08 08:11:01
    Java引用类型与常量  引用数据类型  Java中,引用类型的变量非常类似于C/C++的指针。  引用类型指向一个对象,指向对象的变量是引用变量,这些变量在声明时被指定为一个特定的类型,比如Employee、Pubby等,...
  • Java引用类型分类以及详解

    千次阅读 2018-06-11 00:10:46
    Java引用类型分类以及详解 - Java引用类型概述 在JVM之中再好的算法,也敌不过一个好烂的程序员。一个程序要想写好有两点:按照开发标准进行、请写有用代码。 而对于垃圾的产生与回收的处理之中,要想进行更好...
  • 深入JVM之Java引用类型

    千次阅读 2016-10-19 21:36:04
    深入JVM之Java引用类型引用类型可以说是整个Java开发的灵魂所在,如果没有合理的引用操作,那么就有可能产生垃圾问题,但是对于引用也需要有一些合理化的设计。在很多的时候并不是所有的对象都需要被我们一直使用,...
  • java引用类型分析

    千次阅读 2018-07-05 11:24:51
    java的几种引用类型如下,其中
  • JAVA引用类型强制类型转换

    千次阅读 2017-09-17 20:23:45
    今天在看《Java核心技术》卷一的泛型程序设计章节的时候,提到了通过捕获异常后,然后强制类型转换为... 强制类型转换分两类:基本数据类型的强制类型转换、引用类型的强制类型转换。这里讲下引用类型强制转换。
  • java引用类型详解

    千次阅读 2020-02-06 15:53:53
    1.强引用引用所指向的对象,任何时候都不会被系统回收。即使JVM抛出OOM异常 2.软引用 当堆使用临近阈值时,才会回收软引用的对象,可用于对内存敏感的Cache 3.弱引用 4.虚引用 ...
  • Java引用类型的强制类型转换

    千次阅读 2018-07-22 22:30:10
    正如有时候需要将浮点型的... 编写Java程序时,引用类型只能调用声明该变量的类型的方法,也就是编译时类型的方法,不允许调用运行时类型所定义的方法,即使它实际所引用的对象包含该方法。解释一下就是我们说的...
  • Java 引用类型转换

    2017-02-08 10:10:12
    引用类型转换 1. 向上类型转换(隐式/自动类型转换),是小类型到大类型的转换,这个是不存在风险的 2.向下类型转换(强制类型转换),是大类型到小类型,这个是存在风险的,容易溢出 3.instanceof 运算符,来...
  • java引用类型数据包括数组,接口,等等,当参数是引用类型时,“传值”传递的是变量中存放是“引用”,儿不是变量所引用的实体,下面有两个个很好的例子: 例子1: 首先写一个电池类,和收音机类package Example1; ...
  • java引用类型和基本类型的比较

    千次阅读 2017-07-18 23:37:24
    引用类型和基本类型的分类,不在写了,网上有很多。我们知道: 当两个基本类型使用”==”比较时,他们比较的是值。 当两个引用类型使用”==”比较时,他们比较的是地址。 当两个引用类型使用方法equals()比较时,...
  • Java数组属于引用类型对象,以此为例说明地址引用和内容复制的区别 1.地址引用 为一个数组变量赋值另一个数组变量后,2个数组变量指向同一个内存地址,引用同一个数组对象,此时内存中并没有建立新的数组对象。 2....
  • Java引用类型详解

    千次阅读 2014-07-29 20:16:42
    JVM 的垃圾回收器对于不同类型引用有不同的处理方式。 java中对于一个对象来说,只要有引用的存在,它就会一直存在于内存中。 如果这样的对象越来越多,超出了JVM中的内存总数,JVM就会抛出OutOfMemory错误。 ...
  • 之前一直以为java引用类型的强制转换是随便一种到另外一种,今天才发现不是,唉,还是语法基础不够啊! 这玩意针对于父类和子类多一点 比如上面的代码,record.get("col1")得到的是Object类的对象,而Object...
  • java引用类型的强制类型转换

    千次阅读 2016-10-12 13:59:13
    这里的引用father指向内存中对象实质还是Son类型,不过对象的功能被临时削弱为father。 2.向下转型:即强制类型转换。 被向上造型的对象进行强制类型转换是没有问题的: Son son =(Son)father;
  • Java为我们提供了两种不同 的类型:原始类型和引用类型
  • 引用类型变量表示在栈中引用了一个地址指向了堆中的对象,那么通常所说的这个变量的值指的是对象还是地址?如果一个引用类型的值为null,如何理解?地址为空还是引用一个地址指向一个空对象?谢谢!
  • JAVA 引用类型数组的初始化

    千次阅读 2016-06-30 23:24:35
    引用类型数组的数组元素是 引用. 我们之前学习过的基本类型数组, 它里面的数组元素存放的是具体的值. 可以当作我们现实生活中的买房, 基本类型数组呢, 就像是你直接找到了房主. 而引用类型数组就像是你没有...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 60,822
精华内容 24,328
关键字:

java引用类型

java 订阅