在JDK1.2以后将对象应用分为4中,强引用,软引用,弱引用,虚引用,这样的方式可以更加灵活控制对象的声明周期
 
 
强引用
 
String str = "123";
 
这时我们日常用的引用,只要对象与强引用关联,如果内存不足时,JVM宁愿抛出OutOfMemoryError内存溢出错误也不会回收强引用
 
如果想要JVM回收强引用类型的对象,将其引用更改为null,JVM会在合适的时间回收这个null引用队形
 
软引用
 
java中使用softRefence来表示软引用,如果某个对象与软引用关联,那么JVM只有在内存不足时回收该类引用
 
利用这个特性软引用可以用来做缓存
例如:
SoftReference<String> srs = new SoftReference<String>("123");
System.out.println(srs.get()); //
System.gc();
System.out.println(srs.get());//
 
因为内存充足所有无法回收
软引用适合做缓存,在内存足够是,直接通过软引用取值,无需从真实的来源中查询数据,可以显著的提升网站性能,当内存不足时,能让JVM进行回收,从而删除缓存,这时候只能从真实来源查询数据
 
 
 
弱引用
 
java中使用WeackReference来表示弱引用,如果某个对象与弱引用关联,那么当JVM在进行垃圾回收是,无论内存是否充足都会回收此类对象
 

WeakReference<String> str = new WeakReference<String>(new String("123"));
System.out.println(str.get()); //
System.out.println(str.getClass()); // class java.lang.ref.WeakReference
//通知JVM进行内存回收
System.gc();
System.out.println(str.get()); //null
 
可以看出,被弱引用关联的对象,在调用垃圾回收以后就会被回收,
 
弱引用可以在回调函数在防止内存泄漏,因为回调函数芳芳是匿名内部类,一个非静态的内部类会隐式地持有外部类的一个强引用,当JVM在回收外部类的时候,此时回调函数在某个线程里被回调的时候,JVM就无法回收外部类,造成内存泄漏,
 
虚引用
 
java中使用PhantomReference来表示虚引用,引用就好事虚设一样,就想某个对象没有引用关联一样,若某个对象与虚引用关联,那么任何时候都可能被虚拟机回收,虚引用不能单独使用,必须配合引用队列一起使用
 

PhantomReference<String> ph = new PhantomReference<String>("123", new ReferenceQueue<String>());
System.out.println(ph.get()); // null
get方法没有获取到值,
当垃圾回收器准备回收一个对象时,如果发现它与虚引用关联.就会在他回收以前将这个虚引用加入到引用队列中,程序可以判断引用队列中是否加入了虚引用,来了解被引用的对象是否将要被回收,如果确实要被回收,就可以做一些回收之前的收尾工作

Java四中引用的更多相关文章

  1. java强引用、软引用、弱引用、虚引用

    前言概述 在JDK1.2以前的版本中,当一个对象不被任何变量引用,那么程序就无法再使用这个对象.这就像在日常生活中,从商店购买了某样物品后,如果有用,就一直保留它,否则就把它扔到垃圾箱,由清洁工人收走 ...

  2. Atitit java方法引用(Method References) 与c#委托与脚本语言js的函数指针

    Atitit java方法引用(Method References) 与c#委托与脚本语言js的函数指针   1.1. java方法引用(Method References) 与c#委托与脚本语言js ...

  3. java 它 引用(基本类型的包装,构造函数和析构函数c++不同)

      一个:java 和c++参考控制 他提到引用,我们会想到java它不喜欢c++里面的指针.当然java内引用和c++里面的引用是不同的. 比如: 比方C++中,我对某一个函数的声明.int a(i ...

  4. Java Object 引用传递和值传递

    Java Object 引用传递和值传递 @author ixenos Java没有引用传递: 除了在将参数传递给方法(或函数)的时候是"值传递",传递对象引用的副本,在任何用&q ...

  5. Java的引用c++的引用和C指针的区别

    Java的引用本质上就是C中的指针,而c++的引用则完全不同:有一个类 class Point { int x; int y;} 同样的一个Point p; 在Java中p表示一个引用,它等同于C语言 ...

  6. java的引用数据类型,你知道吗???

    有些人很清楚java的八种基本数据类型,但说到java的引用数据类型就不清楚了. Java的数据类型分为两大类,即基本数据类型和引用数据类型,在基本数据类型中有8种 基本数据类型(逻辑型-boolea ...

  7. Java强引用、软引用、弱引用及虚引用深入探讨

    强引用.软引用.弱引用和虚引用深入探讨 为了更灵活的控制对象的生命周期,在JDK1.2之后,引用被划分为强引用.软引用.弱引用.虚引用四种类型,每种类型有不同的生命周期,它们不同的地方就在于垃圾回收器 ...

  8. java强引用,软引用,弱引用,虚引用

    java强引用,软引用,弱引用,虚引用 原文:https://blog.csdn.net/liaodehong/article/details/52223354 用了Java怎么长时间一直不知道原来J ...

  9. Java中引用的详解

    Java中没有指针,到处都是引用(除了基本类型).所以,当然,你肯定知道java的引用,并用了很久,但是是不是对此了解地比较全面?而这些引用有什么作用,且有什么不同呢?Java中有个java.lang ...

随机推荐

  1. WINDOWS平台下的栈溢出攻击从0到1(篇幅略长但非常值得一看)

    到1的这个过程.笔者也希望能够通过这些技术分享帮助更多的朋友走入到二进制安全的领域中.2.文章拓扑由于本篇文章的篇幅略长,所以笔者在这里放一个文章的拓扑,让大家能够在开始阅读文章之前对整个文章的体系架 ...

  2. job任务执行流程与分区机制

    job任务执行流程    1.run job阶段        ①收集整个job的环境信息(比如通过conf设定的参数,还有mapperClass,reducerClass,以及输出kv类型)     ...

  3. flask加vue 动画 加载更多

    曾经使用flask_paginate(地址:https://blog.csdn.net/qq_42239520/article/details/80378095)进行分页,现在又想新的想法,怎么才能和 ...

  4. Redhat/CentOS 制作本地yum源

    一.制作本地yum源的场景有: (1) 操作系统ISO文件是通过光驱读取的 (2) 操作系统ISO文件是通过USB设备挂载的 (3) 操作系统ISO文件是被上传到本地文件夹的形式 二. 这3种配置方式 ...

  5. xamarin android 需要获取apk签名工具

    请打开vs 扩展 搜索 android keystore signature tool 如果是Release 记得查找对应的keystore 文件然后进行获取签名

  6. 插入排序的Java代码实现

    插入排序也是一类非常常见的排序方法,它主要包含直接插入排序,Shell排序和折半插入排序等几种常见的排序方法. 1.直接插入排序 直接插入排序的思路非常简单:依次将待排序的数据元素按其关键字值的大小插 ...

  7. CentOS 部署 Python3 的一些注意事项

    环境:centos6.7https://github.com/vinta/awesome-pythonhttps://github.com/PyMySQL/PyMySQLhttps://github. ...

  8. 确保线程安全下使用Queue的Enqueue和Dequeue

    场景是这样,假设有一台设备会触发类型为Alarm的告警信号,并把信号添加到一个Queue结构中,每隔一段时间这个Queue会被遍历检查,其中的每个Alarm都会调用一个相应的处理方法.问题在于,检查机 ...

  9. Android_触摸事件传递机制

    Android中dispatchTouchEvent,onInterceptTouchEvent, onTouchEvent的理解ecandroid中的事件类型分为按键事件和屏幕触摸事件,Touch事 ...

  10. 详解C#泛型(一)

    一.C#中的泛型引入了类型参数的概念,类似于C++中的模板,类型参数可以使类型或方法中的一个或多个类型的指定推迟到实例化或调用时,使用泛型可以更大程度的重用代码.保护类型安全性并提高性能:可以创建自定 ...