在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. WPF TreeView BringIntoViewBehavior

    由于项目需要,需要能够定位TreeView中的点,TreeView的节点数过多的情况下,即使找到了对应的节点并选中展示了,由于不在可视区域内,给用户的感觉还是不好,因此设计如下的Behavior,来实 ...

  2. WPF Slider滑动条的颜色修改

    效果如下: 鄙人虽然开发WPF有些时间,但之前一直是一些简单Template和Style改改之类的工作,并没有深入研究过.此次为了完成工作,首先也是网上搜了半天,没有找到合适的代码直接拷贝(搜索能力待 ...

  3. XML随笔:语法快速入门及当下流行的RSS简析

    今天是本人第一次写博客,之前闭门造车闹出过很多笑话,恰巧这几天刚刚重温了一遍XML的知识,决定把XML的知识再来从头到尾的理一遍,感触颇多,今天分享给大家.希望大家能多多注意其中的要点. 1.定义 首 ...

  4. 「PKUSC2018」主斗地(暴搜)

    这道斗地主比 \(PKUWC\) 那道可做多了... 我们用 \(NOIP\) 那道斗地主的思路:暴搜出三代和四代,贪心出散牌. 还有jry为什么要出xx网友而不出他的另一个老婆 我们发现两个人的每回 ...

  5. SpringBoot入门之内嵌Tomcat配置

    spring boot默认web程序启用tomcat内嵌容器tomcat,监听8080端口,servletPath默认为 / .需要用到的就是端口.上下文路径的修改,在spring boot中其修改方 ...

  6. 为什么transform对行内元素不生效

    注:赶时间的同学可直接下拉到底,看结论. 我使用transform对一个元素进行位移,代码如下: <div class="box"> <span>今天你吃了 ...

  7. canvas 实现签名效果

    效果图 概述 在线签名,现在在很多场景下都能看到,而且在移动端见的比较多. 用canvas和svg都可以实现,而且跨平台能力也很好. canvas基于像素,提供 2D 绘制函数,提供的功能更原始,适合 ...

  8. CSS选择器之兄弟选择器(~和+)

    今天在改以以前人家写的网页的样式的时候,碰到这个选择器,‘~’,当时我是懵逼的,傻傻分不清 ‘+’ 跟 ‘~’的区别,虽然我知道他们都是兄弟选择器. 后来网上查了下,也许是我查找的方式不对,没有找到我 ...

  9. Quartz深入浅出(一)

    什么是Quartz Quartz是一个开源的作业调度框架,由java编写,在.NET平台为Quartz.Net,通过Quart可以快速完成任务调度的工作. Quartz能干什么/应用场景 如网页游戏中 ...

  10. GPS轨迹数据可视化的三种途径

    有一阵子没写过博客了,最近因为自己小队申请了项目有并且要帮研究生做一些数据处理的小任务,接触到可视化.这里介绍最近学到的了三种方法. 第一种是用python. 这里原理是用matplotlib里面的s ...