在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. JS产生徐特尔图表

    徐特尔图表是一个小游戏,在5*5的格子上,无序的写着1~25这25个数子,然后再找出来.其实在JS中也就是将25个数进行随机产生然后放到一个表格中.主要分为两部分,一是随机数的产生,还有一部分就是表格 ...

  2. NPOI自适应列宽

    当本地没有安装Excel,但是又想导出Excel,采用Office插件是行不通的,NPOI是导出Excel的一个开源的插件.在导出Excel后,为了方便阅读,可以才采用自适应列宽的方式使得单元格的宽度 ...

  3. 操作Checkbox标签

    在前端开发中,少不了对Checkbox的操作. 常用的的方法有2个:.is()和.prop()方法.前者是判断 checkbox的状态,选不是未选.而后者为checkbox设置一个值,可以设置chec ...

  4. 【转】JS浮点数运算Bug的解决办法

    37.5*5.5=206.08 (JS算出来是这样的一个结果,我四舍五入取两位小数) 我先怀疑是四舍五入的问题,就直接用JS算了一个结果为:206.08499999999998 怎么会这样,两个只有一 ...

  5. 游戏AI玩伴,是“神队友”还是“猪队友”?

    “一代英豪”暴雪迎来了自己的暴风雪. 2月13日,动视暴雪公布了2018年全年财报.财报显示,暴雪第四季度营业收入仅为28.4亿美元,低于华尔街分析师预期的30.4亿美元.在公布了财报业绩后,该公司又 ...

  6. IE6下javascript:void(0)不可用的解决

    <a href="javascript:void(0)" class="inp_sear_a" onclick="doSubmit();&quo ...

  7. 01-Python的基础知识3

    - 数字 - 数字常量: - 整型: - 概念: - 指代平常数学上的整数常量.Python中整型指代int类型. - 基本运算: - 可以执行平常的+,-,*,/ ,%以及其他操作 假设a=15,b ...

  8. iOS-xcconfig环境变量那些事(配置环境的配置)

    前言 在配置宏定义参数时,会发现一个问题,在需要临时修改或者测试一些数据时,修改宏,如果不修改,就多写一个,注释掉原来的,然后测试后,再换回来,当然了,如果一两个宏,可以这样,但是,如果每次改的比较多 ...

  9. MySQL查询50例

    创建表和关系 /* 创建表 */ /*年级表*/ DROP TABLE IF EXISTS `class_grade`; CREATE TABLE `class_grade` ( `gid` int( ...

  10. python2和3的区别 高清大图:)

    点击图片,新标签中打开查看!或右键‘图片另存为’!