精华内容
下载资源
问答
  • java引用

    千次阅读 2020-05-07 10:50:02
    引用: String str = “abc”; list.add(str); 软引用: 如果弱引用对象回收完之后,内存还是报警,继续回收软引用对象 SoftReference<A> sr = new SoftReference<A>(a); 弱引用: ...
      

    强引用:

    String str = “abc”;

    list.add(str);

    软引用:

    如果弱引用对象回收完之后,内存还是报警,继续回收软引用对象

    SoftReference<A> sr = new SoftReference<A>(a);

    弱引用:

    WeakReference<Car> weakCar = new WeakReference(Car)(car);

    如果虚引用对象回收完之后,内存还是报警,继续回收弱引用对象

    虚引用:

    虚拟机的内存不够使用,开始报警,这时候垃圾回收机制开始执行System.gc(); String s = “abc”;如果没有对象回收了, 就回收没虚引用的对象。


    v2-42a6715d4aea70deecaa40924aa395fb_b.jpg

    展开全文
  • Java引用数据类型String详解

    万次阅读 2020-07-02 23:54:44
    Java引用数据类型(String)引用数据类型概述引用数据类型与基本数据类型的差别(举例说明) 引用数据类型概述 说到引用数据类型,那么何为引用数据类型? 引用类型,都可以用null值作为值,也就是说可以在初始化的...

    引用数据类型概述

    说到引用数据类型,那么何为引用数据类型?
    引用类型,都可以用null值作为值,也就是说可以在初始化的时候赋值为null,String是引用类型,也就是说可以使用null作为值。
    在这里插入图片描述

    引用数据类型与基本数据类型的差别(举例说明)

    使用基本数据类型:
    int i1 = 1
    int i2 = 1
    这种是会在内存中存储两个1的值

    但是,使用引用类型就不会!
    String s = “hello”
    String s1 = “hello”
    这种,是不会在内存中存在两个"hello"的,只存在一个"hello"。

    假设"hello"的内存地址为xxxxxx,声明s变量时给s赋值"hello"实际上让s变量引用"hello"的内存地址xxxxxx;

    当我们再次声明变量s1也赋值为"hello"的时候实际上也是直接把已经存在的"hello"的内存地址给了s1引用

    此乃引用类型和基本数据类型的区别。

    记录自己最近学习到的东西,做一个总结,希望大家喜欢,一起加油!

    展开全文
  • 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引用类型有哪些

    万次阅读 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 项目无法引用javax.swing.JOptionPane JAVA引用JOptionPane类报错 解决方案 报错通常以这种方式报错 原因可能是因为eclipse的环境配置过高或过低导致的不能调用java中的一些包 下面我的解决方法如下 第一...
  • Java引用与C语言指针区别

    千次阅读 2019-04-08 17:38:07
    Java中的引用可以理解为被封装过的指针,与指针相比引用是可控的,所以更加安全。 引用不可以计算而指针可以计算,C语言指针更加灵活,也...Java引用作为函数参数时,传递的是引用值的copy,在函数内部可以改变引...
  • Java引用类型分类以及详解

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

    千次阅读 2017-01-08 08:11:01
    Java引用类型与常量  引用数据类型  Java中,引用类型的变量非常类似于C/C++的指针。  引用类型指向一个对象,指向对象的变量是引用变量,这些变量在声明时被指定为一个特定的类型,比如Employee、Pubby等,...
  • Java 引用传递导致的恶意代码漏洞

    千次阅读 2018-04-17 16:23:59
    Java 引用传递导致的恶意代码漏洞 代码 // 赋值操作只是传递引用,多建立一个引用的关联关系 // private List&lt;String&gt; list; 只是创建一个指向null的引用,并没有创建一个空的List对象 // list...
  • Java引用变量的类型

    千次阅读 2014-07-20 01:29:54
    Java引用变量的类型 1、编译时类型:由声明该变量时使用的类型决定 2、运行时类型:由实际赋给该变量的对象决定  如果编译时类型和运行时类型不一致,就可能出现多态性
  • Java引用详解

    千次阅读 2017-10-12 23:45:47
    正文开始Java四种引用包括强引用,软引用,弱引用,虚引用。 强引用: 就是最普通最常见的引用,这种情况只要引用存在,垃圾回收器就永远不会回收该对象,比如: Object obj = new Object(); 软引用: 若一个对象...
  • 4种Java引用浅解

    万次阅读 多人点赞 2014-04-28 12:56:08
    最近研究Java Cache实现,发现使用到了软引用(SoftReference),不太理解,查阅了JDK文档、代码以及几篇文章。做个小结,如有错误,欢迎指正。 之所以想学习一下Java的...Cache不是仅仅HashMap那么简单,Java引用与Java
  • 文章目录JAVA虚拟机共享数据区方法区java堆线程私有程序计数器PC虚拟机栈本地方法栈GC垃圾回收器引用计数算法可达性分析算法回收和引用类型的关系强引用 StrongReference软引用(SoftReference)弱引用(WeakReference)...
  • Java引用对象

    千次阅读 2018-12-11 10:09:03
    在写了15年C/C++之后,我于1999年开始写Java。借助指针切换(pointer handoffs)等编码实践或者Purify等工具,我认为自己对C风格的内存管理已经得心应手了,甚至已经不记得上次发生内存泄露是什么时候了。所以起初我...
  • Java引用变量调用方法时的

    千次阅读 2017-06-16 09:10:15
    Java引用变量有两个类型,分为:编译时类型和运行时类型 编译时类型:即声明引用变量时的类型 运行时类型:即生成的对象的类型 例如:Animal a=new Dog();其中编译时类型为Animal,运行时类型为Dog. 当相同...
  • java引用类型详解

    千次阅读 2020-02-06 15:53:53
    1.强引用引用所指向的对象,任何时候都不会被系统回收。即使JVM抛出OOM异常 2.软引用 当堆使用临近阈值时,才会回收软引用的对象,可用于对内存敏感的Cache 3.弱引用 4.虚引用 ...
  • Java中的四种引用详解(强引用、软引用、弱引用、虚引用)以及示例代码分析(结合垃圾回收)

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 159,736
精华内容 63,894
关键字:

java引用

java 订阅