Java 引用类型
若内存中一个对象没有任何引用的话,则可以认为该对象已经不再使用了,可以成为GC的候选。不过由于垃圾回收器的运行时间不确定,可被垃圾回收的对象的实际被回收时间是不确定的。对于一个对象来说,只要有引用的存在,它就会一直存在于内存中。如果这样的对象越来越多,超出了JVM中的内存总数,JVM就会抛出OutOfMemory错误。虽然垃圾回收的具体运行是由JVM来控制的,但是开发人员仍然可以在一定程度上与垃圾回收器进行交互,其目的在于更好的帮助垃圾回收器管理好应用的内存。这种交互方式就是使用JDK 1.2引入的java.lang.ref包。从JDK1.2开始,JDK引入了四种级别的引用,分别为:强引用,软引用,弱引用和虚引用。
一、强引用(Strong Reference)
在一般的java程序中用的最多的就是强引用,如Person p = new Person() ,p就是一个对象的强引用。若一个对象具有强引用,那么它在垃圾回收过程中是不会被回收的,当JVM内存不足时,会抛出OutOfMemory异常也不会去回收强应用对象。强引用限制了对象在内存中的存活时间,如若对象A中存在对象B的强引用,那么B的存活时间一定是不小于A的。若对象A没有显示的将B的引用置为null的话,那么只有对象A被回收之后不含有对对象B的引用,对象B才能被回收。
二、软引用(SoftReference)
软引用的在强度上低于强引用,用SoftReference表示。在进行垃圾回收时,若当前内存不足时,只具有软引用的对象将被回收,若仅具有软引用的对象被回收后内存仍不足,此时才会抛出OutOfMemory异常;若内存足够时,就不会回收它。软引用可以和ReferenceQueue 引用队列一起使用,若软引用所引用的对象被垃圾回收后,那么就将该对象的软引用加入到引用队列中。软引用非常适合用于创建缓存的应用。对于需要多次读取数据库的例子来说: ReferenceQueue q = new ReferenceQueue();
//获取数据并且缓存Object obj = Dao.get();
SoftReference ref = new SoftReference(q,obj);
//当在进行数据库的查询时,直接从缓存中获取
Object o = ref.get();
if(o == null)
o = Dao.get();
//当仅存在的软引用的对象被垃圾回收之后,清理引用队列中的软引用对象SoftReference
SoftReference sf = null;
while((sf=q.poll())!=null){
清理软引用对象。
}
三、弱引用(WeakReference)
弱引用在强度上弱于虚引用,只具有软引用的对象相比于软引用具有更短的生命周期。当JVM进行垃圾回收时,扫描到只具有弱引用对象时就会将其进行垃圾回收。弱引用存在的作用在于解决强引用所带来的对象之间在存活时间上的耦合关系,在强引用中对象A中存在着对象B的强引用,除非A对象将对B的引用置为null才能对对象B进行回收;否则,B对象的回收必须在A对象被回收之后。引入弱引用之后,能够解决对象之间生存时间的耦合问题。弱引用的典型应用集合类中,有其哈希表中。哈希表本身就具有对这些键和值对象的引用,若这种引用为强引用的话,若哈希表一直使用那么哈希表将变的越来越大。最终,可能会导致JVM的内存溢出。使用弱引用就不会有这样的问题。JDK中提供了WeakHashMap来满足这一需求。
四、虚引用(Phantom Reference)
又称幽灵引用,又称为幽灵引用或幻影引用,,虚引用既不会影响对象的生命周期,也无法通过虚引用来获取对象实例,仅用于在发生GC时接收一个系统通知。
Object类中的方法finalize()方法被用来在对对象被回收之前做一些清理工作,但Java中的垃圾回收运行的时间是不确定的,因此finalize方法执行的时间也是不确定的。虚引用可以用来解决这个问题,虚引用(Phantom Reference)的使用必须伴随着引用队列。当一个对象的finalize方法被调用了之后,那么将该对象的虚引用加入到引用队列中,可以通过检查引用队列就能够知道对象是否应该被回收了。
参考文献:http://www.infoq.com/cn/articles/cf-java-garbage-references
Java 引用类型的更多相关文章
- 深入理解Java引用类型
深入理解Java引用类型 在Java中类型可分为两大类:值类型与引用类型.值类型就是基本数据类型(如int ,double 等),而引用类型,是指除了基本的变量类型之外的所有类型(如通过 class ...
- Java引用类型之软引用(2)
下面接着上一篇介绍第2阶段和第3阶段的处理逻辑. 2.process_phase2() 第2个阶段移除所有的referent还存活的Reference,也就是从refs_list中移除Referenc ...
- Java引用类型之弱引用与幻像引用
这一篇将介绍弱引用和幻像引用. 1.WeakReference WeakReference也就是弱引用,弱引用和软引用类似,它是用来描述"非必须"的对象的,它的强度比软引用要更弱一 ...
- Java引用类型之最终引用
FinalReference类只有一个子类Finalizer,并且Finalizer由关键字final修饰,所以无法继承扩展.类的定义如下: class FinalReference<T> ...
- WeakHashMap和Java引用类型详细解析
WeakHashMap是种弱引用的HashMap,这是说,WeakHashMap里的key值如果没有外部强引用,在垃圾回收之后,WeakHashMap的对应内容也会被移除掉. 1.1 Java的引用类 ...
- 你不可不知的Java引用类型之——虚引用
定义 虚引用是使用PhantomReference创建的引用,虚引用也称为幽灵引用或者幻影引用,是所有引用类型中最弱的一个.一个对象是否有虚引用的存在,完全不会对其生命周期构成影响,也无法通过虚引用获 ...
- 你不可不知的Java引用类型之——弱引用
定义 弱引用是使用WeakReference创建的引用,弱引用也是用来描述非必需对象的,它是比软引用更弱的引用类型.在发生GC时,只要发现弱引用,不管系统堆空间是否足够,都会将对象进行回收. 说明 弱 ...
- java引用类型简述
主要内容: 1.引用类型简述 2.对象的可达性 3.软引用的垃圾回收分析 4.WeakHashMap分析 5.ThreadLocal内存泄漏分析 1.引用类型简述 在Java语言中除了基本数据类型外, ...
- Java引用类型作为形参和返回值
一.什么是引用类型 在Java中引用类型包括三种:类.抽象类.接口. 二.引用类型作为形参使用 1.类作为形参 /** * 类作为形参,实际传递的是该类的对象 */ class Student { p ...
- 一段代码看 Java 引用类型
Java 中的操作数(不知道叫什么,相对于 bytecode 而言,类似 CPU 的操作码和操作数)分为值类型和引用类型: 值类型就是直接存储最终数值的,如 char, int, float, dou ...
随机推荐
- java_面试_01_一个月的面试总结(java)
重点知识 由于我面试的JAVA开发工程师,针对于JAVA,需要理解的重点内容有: JVM内存管理机制和垃圾回收机制(基本每次面试都会问,一定要搞得透彻) JVM内存调优(了解是怎么回事,一般做项目过程 ...
- Tomcat启动分析(我们为什么要配置CATALINA_HOME环境变量)
原文:http://www.cnblogs.com/heshan664754022/archive/2013/03/27/2984357.html Tomcat启动分析(我们为什么要配置CATALIN ...
- windows 7下mingw+msys编译ffmpeg
windows 7下mingw+msys编译ffmpeg 1-->下载安装MingW,mingw-get-inst-20120426.exe http://sourceforge.ne ...
- ACM学习历程—BZOJ2956 模积和(数论)
Description 求∑∑((n mod i)*(m mod j))其中1<=i<=n,1<=j<=m,i≠j. Input 第一行两个数n,m. Output 一个整数表 ...
- ACM学习历程—FZU2195 检查站点(树形DP || 贪心)
Description 在山上一共有N个站点需要检查,检查员从山顶出发去各个站点进行检查,各个站点间有且仅有一条通路,检查员下山前往站点时比较轻松,而上山时却需要额外的时间,问最后检查员检查完所有站点 ...
- Bootstrap日期/日历插件Datepicker 时间加标记
由于工作需要,项目中使用了Bootstrap日期/日历插件Datepicker,根据需求需要在其中添加日期标记,实现效果图如下: 特此记录此次解决方案: 1.首先分析了功能的DOM元素(如下图),可以 ...
- android使用wcf接收上传图片视频文件
一.Android 权限配置文件: <?xml version="1.0" encoding="utf-8"?> <manifest xmln ...
- ngx通讯之可观察对象实现
1.公共服务 //test.service.ts import {Injectable} from '@angular/core'; import {Subject} from 'rxjs/Subje ...
- 怎么查看mysql的安装目录,环境:windows+mysql+navicat
怎么查看mysql的安装目录 如果忘记了MySQL的安装目录,怎么快速找到呢?方法或许很多,作者觉得这种最方便了 环境:windows+mysql+navicat 方法:进入mysql命令行输入:sh ...
- linux日常管理-抓包工具tcpdump和tshark
抓包工具:查看什么数据占用网卡,把带宽跑满了. 命令:tcpdump 选项:host 指定IP port 指定端口 -c 指定包数量 -w 指定写入文件,不加显示的不是流量包而是流量走向 -nn 作用 ...