精华内容
下载资源
问答
  • Java 强软弱虚 引用

    2020-05-17 18:23:10
    强引用 : A a = new A (); 这就是强引用,只有a = null 或者a 不在指向堆中的 a 对象, a对象才会被jvm 回收 软引用:

    强引用 :

    A a = new A () ; 

    这就是强引用,只有a = null 或者a 不在指向堆中的 a 对象, a对象才会被jvm 回收

    软引用 :

    当内存容量不够时,随时可能被回收,当内存容量足够的时候不会被回收的一种引用.主要用来做缓存使用.

    比如
    
    public static void main(String[] args) {
            // -Xmx20M jvm 分配20M运行内存
            SoftReference<byte[]> demo = new SoftReference<>(new byte[1024 * 1024 * 10]);
            System.out.println(demo.get());
            System.gc();
            try {
                TimeUnit.MILLISECONDS.sleep(1000);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
            System.out.println(demo.get());
            // 在分配15M内存,这个时候, 软引用就会被回收
            byte[] bb = new byte[1024 * 1024 * 15];
    
            System.out.println(demo.get());
        }

    先分配一个10M的byte[],使用的是软引用,当后面再分配一个15M的内存的时候,软引用就会被回收

    运行结果:

    [B@515f550a
    [B@515f550a
    Exception in thread "main" java.lang.OutOfMemoryError: Java heap space
    	at com.improve.soft.T_SoftReference.main(T_SoftReference.java:20)

    理论结果应该是:

    [B@515f550a
    [B@515f550a
    null

    (这个没验证成功,会发生OOM,但是如果把内存调至25或者以上的时候,才会被回收.马士兵的视频是这么讲解和验证的,姑且先这么理解,如果有知道原因的,欢迎评论.)

    这里面的byte[] 就是一个软引用

     

    弱引用:

    当垃圾回收时, 不管内存空间是否充足,都会被回收弱引用对象

    public static void main(String[] args) {
            WeakReference<Demo> demo = new WeakReference<>(new Demo());
            System.out.println(demo.get()); // com.improve.Demo@515f550a
            System.gc();
            System.out.println(demo.get());  // null
    
        }

    TreadLocal中使用的就是弱引用

    虚引用:

    这个引用有跟没有一样,随时都可能被回收,不影响对象的生命周期,主要用来监控对象被垃圾回收活动,与软引用和弱引用的区别时,虚引用必须和引用队列(ReferenceQueue)一起使用.一般用于直接内存操作的对象(NIO, Netty zore copy 使用到)

     

     

    展开全文
  • java强软弱虚引用

    2020-04-13 23:11:50
    1、强引用—用new 当我们用new向堆区申请一片内存空间时,此时就是强引用。 当内存不足,GC(垃圾收集器)不会回收该强引用的对象。 2、软引用—用SofeReference类实现 用来描述一些还有用但并非必需的对象。 ...

    1、强引用—用new

      当我们用new向堆区申请一片内存空间时,此时就是强引用。
    
      当内存不足,GC(垃圾收集器)不会回收该强引用的对象。
    

    2、软引用—用SofeReference类实现

      用来描述一些还有用但并非必需的对象。
    
      对于该类对象,当系统将发生内存溢出前,JVM将会把这类对象列入回收范围中进行第二次回收。如果这次回收还没有足够的内存,抛出内存溢出。
    

    3、弱引用—用WeakReference类实现

      用来描述非必需对象,强度比软引用更弱一些,被弱引用关联的对象只能生存到下一次垃圾收集发生之前。
    
      当GC工作时,无论当前内存是否足够,都会回收掉只被弱引用关联的对象。
    

    4、虚引用—用PhantomReference类实现

      唯一目的就是用来在对象被GC回收时收到一个系统通知。
      [摘自](https://www.cnblogs.com/fankongkong/p/5533966.html)
    
    展开全文
  • Java 强软弱虚引用

    2019-10-04 12:23:59
    Java 强软弱虚引用 Java 根据对象的引用方式可以分为:引用、软引用、弱引用、虚引用。 即 SoftReference、WeakReference、PhantomReference。 SoftReference、WeakReference、PhantomReference 位于 java.lang....

    Java 强软弱虚引用

    Java 根据对象的引用方式可以分为:强引用、软引用、弱引用、虚引用。
    即 SoftReference、WeakReference、PhantomReference。
    SoftReference、WeakReference、PhantomReference 位于 java.lang.ref 包,它们通常和 ReferenceQueue 一起使用。

    强引用

    强引用即对象的直接引用。比如:

    Handler handler = new Handler();

    强引用的对象不会被系统回收。如果内存不足也不会回收强引用对象,JVM 可能抛出 OOM 错误,程序异常终止。
    强引用特点是可以直接访问对象,可能导致内存泄露。

    软引用 SoftReference

    如果一个对象具有软引用,那么当内存足够时,系统不会回收对象;如果内存不够,系统会回收这些对象。

    软引用可以和 ReferenceQueue 队列关联。

        ReferenceQueue<String> queue = new ReferenceQueue<>();
        SoftReference<String> softReference = new SoftReference<>("abc", queue);
    

    如果 SoftReference get() 的对象为空,说明它已被系统回收。

    弱引用 WeakReference

    如果一个对象具有弱引用,那么不管内存是否够用,只要触发垃圾回收,就会回收弱引用的对象。
    Android 里面弱引用 WeakReference 通常和 Handler 连用,避免 Activity 销毁之后,工作线程还在执行,并且使用持有 Activity 强引用的 Handler 发送回调消息。
    从而导致 Activity 声明周期销毁了但是 Activity 对象没有被回收。

    因此改为 Handler 持有 Activity 的弱引用。

    private static class TimeHandler extends Handler {
            private final WeakReference<TimeOutActivity> mReference;
    
            TimeHandler(TimeOutActivity activity) {
                mReference = new WeakReference<>(activity);
            }
    
            @Override
            public void handleMessage(Message msg) {
                super.handleMessage(msg);
                TimeOutActivity activity = mReference.get();
                if (activity == null) {
                    return;
                }
                if (msg.what == MSG_CHECK_TIME) {
                    activity.checkTime();
                }
            }
        }
    

    对比软引用和弱引用,可以发现弱引用的对象具有更短的生命周期,更容易被系统回收。

    虚引用 PhantomReference

    虚引用不会影响对象的声明周期。它用来观察所引用对象是否被回收。
    虚引用的 get 方法总是返回 null,而与它的引用对象无关。
    构造 PhantomReference 时必须传入 ReferenceQueue。

    public class PhantomReference<T> extends Reference<T> {
    ...
        public T get() {
            return null;
        }
    ...
        public PhantomReference(T referent, ReferenceQueue<? super T> q) {
            super(referent, q);
        }
    
    }
    
    展开全文
  • 强引用-FinalReference介绍:强引用是平常中使用最多的引用强引用在程序内存不足(OOM)的时候也不会被回收,使用方式:String str = new String("str");这个str就是强引用。可用场景:地球人都知道,但是我讲不出来...

    强引用-FinalReference

    介绍:

    强引用是平常中使用最多的引用,强引用在程序内存不足(OOM)的时候也不会被回收,使用方式:

    String str = new String("str");

    这个str就是强引用。

    可用场景:

    地球人都知道,但是我讲不出来。

    软引用-SoftReference

    介绍:

    软引用在程序内存不足时,会被回收,使用方式:

    // 注意:wrf这个引用也是强引用,它是指向SoftReference这个对象的,

    // 这里的软引用指的是指向new String("str")的引用,也就是SoftReference类中T

    SoftReference wrf = new SoftReference(new String("str"));

    可用场景:

    创建缓存的时候,创建的对象放进缓存中,当内存不足时,JVM就会回收早先创建的对象。PS:图片编辑器,视频编辑器之类的软件可以使用这种思路。

    软引用使用例子传送门:https://www.cnblogs.com/mjorc...

    弱引用-WeakReference

    介绍:

    弱引用就是只要JVM垃圾回收器发现了它,就会将之回收,使用方式:

    WeakReference wrf = new WeakReference(str);

    可用场景:

    Java源码中的java.util.WeakHashMap中的key就是使用弱引用,我的理解就是,一旦我不需要某个引用,JVM会自动帮我处理它,这样我就不需要做其它操作。

    弱引用使用例子传送门:http://www.importnew.com/2120...

    虚引用-PhantomReference

    介绍:

    虚引用的回收机制跟弱引用差不多,但是它被回收之前,会被放入ReferenceQueue中。注意哦,其它引用是被JVM回收后才被传入ReferenceQueue中的。由于这个机制,所以虚引用大多被用于引用销毁前的处理工作。还有就是,虚引用创建的时候,必须带有ReferenceQueue,使用例子:

    PhantomReference prf = new PhantomReference(new String("str"), new ReferenceQueue<>());

    可用场景:

    对象销毁前的一些操作,比如说资源释放等。Object.finalize()虽然也可以做这类动作,但是这个方式即不安全又低效(传送门:http://blog.csdn.net/aitangyo...,so。

    强调

    上诉所说的几类引用,都是指对象本身的引用,而不是指Reference的四个子类的引用(SoftReference等)。

    展开全文
  • Java强软弱虚引用

    2020-03-31 15:35:59
    文章目录Java软弱虚引用强引用软引用弱引用虚引用 Java强软弱虚引用 强引用 Object obj = new Object() 。这个obj就是一个强引用,jvm不会在垃圾回收的时候对这些引用回收,选择OutOfMemoryError 终止程序 软...
  • java 强软弱虚引用

    2019-12-16 17:50:35
    在jdk1.2之后,java对引用的概念进行了扩充,将引用分为引用(Strong Reference)、软引用(Soft Reference)、弱引用(Weak Reference)、虚引用(Phantom Reference)四种,这四种引用强度依次逐渐减弱。...
  • 以前学习强软弱虚引用的时候,只是走马观花看看博客,并没有自己写代码去实践、去证明,导致每次看完后,过不了多久就忘了,后来下定决心,一定要自己敲敲代码,这样才能让印象更加深刻,古人云:纸上得来终觉浅,绝...
  • java强软弱虚引用总结

    2020-10-02 18:34:07
    1、强引用(死也不回收) new出来的对象 ,死也不回收 OOM的主要原因之一 2、软引用(不够即回收) 内存够时不清空,内存不够时 执行二次回收,回收后依然不够后报OOM User u = new User(); SoftReference<...
  • 虚引用二、引用:1. 正常创建的对象,只要引用存在,永远不会被GC回收,即使OOMObject obj = new Object();2. 如果要中断引用和某个对象的关联,为其赋值null,这样GC就会在合适的时候回收对象3. Vector类的...
  • Java中的引用强软弱虚

    千次阅读 2016-04-25 11:24:28
    前言 之前在研究MVP的时候接触过弱引用,用来避免...正文1,引用是什么每种语言都有自己的数据处理方式,比如在c或c++中我们经常使用指针来间接的操纵对象,而在Java中,操纵的标识符实际上是指向一个对象的“句柄”
  • Java中有四种引用类型:引用、软引用、弱引用、虚引用Java为什么要设计这四种引用 Java的内存分配和内存回收,都不需要程序员负责,都是由伟大的JVM去负责,一个对象是否可以被回收,主要看是否有引用指向此...
  • Java强软弱虚引用Reference 本文目的:深入理解Reference 本文定位:学习笔记 学习过程记录,加深理解,提升文字组合表达能力。也希望能给学习Reference的同学一些灵感 源码说明 源码基于jdk1.8.0_111: ...
  • link-JAVA多线程与高并发系列[前言,大纲,目录] ThreadLocal 假设有一个静态变量,线程使用它的过程中可能会做一些修改,但是这些修改只想在这个线程内部生效,不想影响其他线程,那么就应该用ThreadLocal. 举个栗子 ...
  • 主要给大家介绍了关于java引用类型之强软弱虚的相关资料,文中通过示例代码介绍的非常详细,对大家学习或者使用java具有一定的参考学习价值,需要的朋友们下面来一起学习学习吧
  • Java强软弱虚4大引用

    2017-11-27 16:46:16
    概念:System.gc(),实际上System.gc()调用的又是 ...强软弱虚。这4个引用出现的背景实际上就是为了我们在一定程度上对gc的可控,让它变得尽量的符合我们对内存分配的预期。强引用强引用就是Object o = new Object()
  • java 软 弱 虚引用的理解正确使用

    千次阅读 2018-12-02 12:52:01
    1、强引用(StrongReference) ...当内存空间不足,Java虚拟机宁愿抛出OutOfMemoryError错误,使程序异常终止,也不会靠随意回收具有强引用的对象来解决内存不足的问题。如果不使用时,要通过如下方式来弱化引...
  • Java中的强软弱虚

    2018-06-27 14:10:47
    从JDK1.2版本开始,把对象引用分别四中级别,从而使程序能更加灵活的控制对象的生命周期,四中级别由高到低依次为:引用、软引用、弱引用和虚引用。1、引用: 比如 Object object=new Object(); new 创建出来的...
  • 软引用、弱引用、虚引用,全都继承自同一个抽象类,这个抽象类Reference,这个抽象类实现了引用类的主要方法,另外三个对它的扩展很少。看了一下 java 8 的源码软引用只是添加了个时间戳,弱引用什么都没添加,虚引...
  • 我们知道java是有垃圾回收机制的一种语言,根据垃圾回收时的策略,java将对于堆对象的引用又进行了细分,引用被分为了引用,软引用,弱引用和虚引用引用 引用又称普通引用,它是最常见的一种引用类型,一般...
  • Java中的强软弱虚引用

    2011-09-27 15:50:37
    笔者自己的通俗总结,5分钟搞清楚java中强软弱虚引用的区别^_^
  • jvm之强软弱虚引用

    万次阅读 2020-07-16 19:58:56
    强软弱虚引用java中,除了基本数据类型的变量外,其他所有的变量都是引用类型,指向堆上各种不同的对象。 在jvm中,除了我们常用的引用外,还有软引用、弱引用、虚引用,这四种引用类型的生命周期与jvm的垃圾...
  • ava:对象的、软、弱和虚引用 ...标签:Java软引用弱引用休闲虚引用 原创作品,允许转载,转载时请务必以超链接形式标明文章原始出处、作者信息和本声明。否则将追究法律责任。http://zhangjunhd.blog.51ct...
  • 1 强引用 1.1 什么是强引用 // 情况1 static Object o = new Object(); // 情况2 public void get(){ Object o = new Object(); } 就是最普通的创建对象方式,当使用new关键字经过创建对象的三个步骤完成之后,...
  • 浅谈Java中强软弱虚引用什么是强软弱虚引用?为什么要搞出来这四种引用?什么情况下可以用到这四种引用呢?本文主要探讨这三个问题!1基本概念引用:在Java程序中通过调用构造器方法或者反射的方式创建出来的对象...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 1,570
精华内容 628
关键字:

java强软弱虚引用

java 订阅