Java Reference简要概述
@(Java)[Reference]
Java Reference简要概述
Reference
对象封装了其它对象的引用,可以和普通的对象一样操作。
Java提供了四种不同类型的引用,引用级别从高到低分别为FinalReference
,SoftReference
,WeakReference
,PhantomReference
。其中FinalReference
不向外提供。每种类型对应着不同级别的可达性。
强引用FinalReference
强引用指的是,程序中有直接可达的引用,而不需要通过任何引用对象,如Object obj = new Object();中,obj为强引用。
软引用SoftReference
软引用,非强引用,但是可以通过软引用对象来访问。软引用的对象,只有在内存不足的时候(抛出OOM异常前),垃圾收集器会决定回收该软引用所指向的对象。软引用通常用于实现内存敏感的缓存。
Object obj = new Object();
SoftReference<Object> softRef = new SoftReference<Object>(obj);
弱引用WeakReference
弱引用,非强引用和软引用,但是可以通过弱引用对象来访问。弱引用的对象,不管内存是否足够,只要被垃圾收集器发现,该引用的对象就会被回收。实际的应用见WeakHashMap
等。
Object obj = new Object();
WeakReference<Object> weakRef = new WeakReference<Object>(obj);
虚引用PhantomReference
虚引用,该引用必须和引用队列(ReferenceQueue
)一起使用,一般用于实现追踪垃圾收集器的回收动作,比如在对象被回收的时候,会调用该对象的finalize方法,在使用虚引用可以实现该动作,也更加安全。
Object obj = new Object();
ReferenceQueue<Object> refQueue = new ReferenceQueue<>();
PhantomReference<Object> phantom = new PhantomReference<Object>(obj, refQueue);
ReferenceQueue
该队列作为引用中的一员,可以和上述三种引用类型组合使用,该队列的作用是:创建引用时,注册进引用中,当该引用所引用的对象被垃圾收集器回收时,会将该引用注册进队列中,相当于一种通知机制。
示例:
ReferenceQueue<Product> queue = new ReferenceQueue<>();
Product product = new Product();
Reference<Product> productRef = new WeakReference<Product>(product, queue);
logger.debug(""+productRef.get());
// 将其变为弱引用,因为设置为null后,只有productRef引用该对象
product = null;
System.gc();
logger.debug(""+productRef.get());
//这里的sleep不能去掉,因为删除后,垃圾收集器还没有来得及注册进queue中
Thread.sleep(1);
Reference<? extends Product> reference = null;
while((reference=queue.poll()) != null) {
logger.debug("reference:"+Arrays.asList(reference,reference.get()));
}
输出如下:
2016-07-16 10:39:39 [DEBUG]-[Thread: main]-[com.jabnih.analysis.ref.ReferenceDemo.demo()]:
Product [prodId=null, vendId=null, prodName=null, prodPrice=null, prodDesc=null]
2016-07-16 10:39:39 [DEBUG]-[Thread: main]-[com.jabnih.analysis.ref.ReferenceDemo.demo()]:
null
2016-07-16 10:39:39 [DEBUG]-[Thread: main]-[com.jabnih.analysis.ref.ReferenceDemo.demo()]:
reference:[java.lang.ref.WeakReference@746c0995, null]
参考
官方文档:
http://docs.oracle.com/javase/7/docs/api/java/lang/ref/package-summary.html#package_description
博客:
http://www.importnew.com/20468.html
http://hongjiang.info/java-referencequeue/
http://blog.csdn.net/lyfi01/article/details/6415726
Java Reference简要概述的更多相关文章
- java容器简要概述
java中集合框架的概述 java集合类主要用于保存对象的. 常用的集合对象: Colletion接口,Collection接口是集合中的顶层容器,表示的是一组对象,它的下面有两个子接口List接口和 ...
- Java Reference 源码分析
@(Java)[Reference] Java Reference 源码分析 Reference对象封装了其它对象的引用,可以和普通的对象一样操作,在一定的限制条件下,支持和垃圾收集器的交互.即可以使 ...
- java Reference
相关讲解,参考: Java Reference 源码分析 Java Reference详解 Reference: // 名称说明下:Reference指代引用对象本身,Referent指代被引用对象 ...
- Java Reference & ReferenceQueue一览
Overview The java.lang.ref package provides more flexible types of references than are otherwise ava ...
- Notes 20180506 : Java程序设计语言概述
2.Java程序设计语言概述 如果对于开发语言的排行榜有所关注的话,那么会发现很长一段时间以来Java都是位居榜首的高级开发语言,作为一个Java开发者,为此感到骄傲的同时也深感忧虑,骄傲的是自己接触 ...
- (转)Hibernate框架基础——Java对象持久化概述
http://blog.csdn.net/yerenyuan_pku/article/details/52732990 Java对象持久化概述 应用程序的分层体系结构 基于B/S的典型三层架构 说明 ...
- Java:多线程概述与创建方式
目录 Java:多线程概述与创建方式 进程和线程 并发与并行 多线程的优势 线程的创建和启动 继承Thread类 start()和run() 实现Runnable接口 实现Callable接口 创建方 ...
- Java面向对象(概述,构造函数,类与对象的关系,this关键字,成员、局部),匿名对象的调用,构造代码块(5)
Java面向对象(概述,构造函数,类与对象的关系,this关键字,成员.局部),匿名对象的帝爱用,构造代码块(5)
- Java Reference核心原理分析
本文转载自Java Reference核心原理分析 导语 带着问题,看源码针对性会更强一点.印象会更深刻.并且效果也会更好.所以我先卖个关子,提两个问题(没准下次跳槽时就被问到). 我们可以用Byte ...
随机推荐
- OOM killer
Linux下有一种OOM KILLER 的机制,它会在系统内存耗尽的情况下,启用自己算法有选择性的kill 掉一些进程. 1. 为什么会有OOM killer 当我们使用应用时,需要申请内存,即进行m ...
- CentOS 7安装JDK
一.卸载系统自带的openjdk 1.查询系统内置的jdk,使用命令如下: rpm -qa | grep java 此时会列出系统中存在的jdk,如果存在就进行卸载,不存在就直接进行安装. 2.进行卸 ...
- MultiThread
Stephen Toub From MicroSoft Crop. Stephen Cleary It's All About the SynchronizationContext How would ...
- git教程链接
http://www.liaoxuefeng.com/wiki/0013739516305929606dd18361248578c67b8067c8c017b000
- Android的setVisibility(View.GONE)无效的问题及原因分析(转)
出现这种情况很可能是因为设置了animation,并且调用了setFillAfter(true),这就会导致setVisibility无效,只需要调用一下clearAnimation()方法或者去掉s ...
- 可运行jar包的几种打包/部署方式
java项目开发中,最终生成的jar,大概可分为二类,一类是一些通用的工具类(不包含main入口方法),另一类是可直接运行的jar包(有main入口方法),下面主要讲的是后者,要让一个jar文件可直接 ...
- [[其他教程]] 2015年最新版iOS基础视频_最适合初学者入门
主讲:孙庆虎类型:iOS 适合对象:初学者入门视频介绍:本视频是iOS学院精心录制的免费精华版iOS语言基础视频,该视频特点在于最大程度保证了知识点的完整性,按知识点进行视频录制,每个视频控制在20分 ...
- MarkdownPad2 Pro v2.4.2.29969 专业中文破解版完美支持table表格语法
在网上搞了半天,终于搞定了支持table简写语法的markdown软件. 下载地址:http://download.csdn.net/detail/wang_jun_hua/8180717 下载包内含 ...
- 微信小程序之小豆瓣图书
最近微信小程序被炒得很火热,本人也抱着试一试的态度下载了微信web开发者工具,开发工具比较简洁,功能相对比较少,个性化设置也没有.了解完开发工具之后,顺便看了一下小程序的官方开发文档,大概了解了小程序 ...
- 吉特仓库管理系统-.NET打印问题总结
在仓储系统的是使用过程中避免不了的是打印单据,仓库系统中包含很多单据:入库单,出库单,盘点单,调拨单,签收单等等,而且还附带着很多的条码标签的打印.本文在此记录一下一个简单的打印问题处理方式.处理问题 ...