Java杂谈2——引用与跟搜索算法
Java中的引用
Java“引用”的概念源于C++,原本的定义相当有限:一个引用(Reference)代表的内存通常用于指向另一块内存区域的起始地址。通过引用类型保存的起始地址,可以找到这个引用所指向的对象实例和在方法区中的对象类型数据。
区别于传统的c/c++语言,Java的对象的销毁完全由垃圾回收器管理,核心问题就是何时应该回收对象?
Java的策略是:回收那些再也不会被任何引用指向的对象,我们将实例化对象的是否被引用的特性称之为可达性。
其实,这种策略并不涵盖所有的使用情景。试想,我们希望创建一些缓存对象用于存储临时的中间计算结果,当内存充裕时将它们会保留在内存中;当内存非常紧张时,即使优先回收这些对象对程序的执行正确性并不会有影响。此时,传统的Java引用就显得束手无策了。自JDK1.2后,Java引用的概念得到了新的扩展,将引用划分为强引用(Strong Reference)、软引用(Soft Reference)、弱引用(Weak Reference)和虚引用(Phantom Reference)。
强引用 > 软引用 > 弱引用 > 虚引用
强引用:Java代码中默认的引用类型就是强引用,除非实例化对象不可达,否则不会被回收。例子如下:
Object objRef = new Object(); //objRef是一个强引用
软引用:即使实例化对象可达,软引用的对象还是会在发生内存溢出之前(Java堆内存不够用时)被垃圾回收器回收,例子如下:
//上接之前的代码,创建一个软引用
SoftReference objSoftRef = new SoftReference(objRef); Object objRef2 = (Object)objSoftRef.get(); //如果此时软引用还未被回收,可以通过这段代码重新或得到实例化对象的强引用,否则会返回null
弱引用:比软引用更弱,在下一次垃圾回收器收集到弱引用后对象会被回收,具体用法与软引用一致,弱引用类类名为WeakReference。
虚引用:这个引用很特殊,其存在不影响对应的实例化对象的生命周期,也不能够通过get方法再获取到对象的强引用。与一个特殊的引用队列(ReferenceQueue)配合使用可以用于监听实例化对象的回收事件。例子如下:
//上接之前代码,创建一个引用队列
/************************************************
** 解释一下引用队列:
** 在一个实例化对象被垃圾回收器回收之前,与这个对象相关的引用对象(Java.lang.refReference类型)都会被加入到与之相关的引用队列中
*************************************************/
ReferenceQueue queue = new ReferenceQueue (); //创建一个虚引用,同时将这个虚引用与队列queue相关联
PhantomReference objPhaRef = new PhantomReference(obj,queue); assertNull(queue.poll()); obj = null; //obj对象在被回收之前,objPhaRef 对象就会被加入到queue队列中
assertNull(queue.poll());
根搜索算法
垃圾回收器在判定一个对象是否可以被回收时采用的是根搜索算法,基本思想:从已知的GC Roots对象开始遍历向下搜索,找到所有的可达实例化对象,回收所有不可达的实例化对象。GC Roots对象包含如下:
虚拟机栈中的引用对象
方法区中的静态引用对象
常量池中的常量引用对象
本地方法栈中的引用对象
那么,当一个实例化对象在被确定不可达之后,会被马上“杀死”吗?
答案是否定的,其中的例外小技巧就是在finalize()函数。为了保证c++程序员能够接受,java提供了类似于析构函数的finalize,垃圾回收器保证一个对象在被真正销毁之前必定调用过一次finalize。那么,我们就可以在这个finalize函数中再次将本对象赋值给一个外部引用,试图在真正销毁之前挽救对象。(PS:但是需要注意的是,类似于表达finalize函数并不是java中的虚构函数,它并不保证是在对象真正销毁之前被调用的最后一个函数,它只保证一个对象在被销毁之前必定会被调用过一次)。
Java杂谈2——引用与跟搜索算法的更多相关文章
- Java学习之强引用,弱引用,软引用 与 JVM
1.java内存管理分为内存分配和内存回收,都不需要程序员负责. 2.垃圾回收的机制主要是看对象是否有引用指向该对象. java对象的引用包括 强引用 软引用 弱引用 虚引用 3.强引用 是指创建 ...
- Java web项目引用java项目,类型找不到
Java web项目引用java项目,类型找不到 错误信息: java.lang.ClassNotFoundException: org.codehaus.jackson.map.ObjectMapp ...
- Java四种引用包括强引用,软引用,弱引用,虚引用。
Java四种引用包括强引用,软引用,弱引用,虚引用. 强引用: 只要引用存在,垃圾回收器永远不会回收Object obj = new Object();//可直接通过obj取得对应的对象 如obj.e ...
- 闲来无事,用Java的软引用写了一个山寨的缓存
闲来无事,用Java的软引用写了一个山寨的缓存 博客分类: java基础 众所周知java中的引用分为 StrongReference.SoftReference.WeakReference.Phan ...
- Java 集合 持有引用 & WeakHashMap
Java 集合 持有引用 & WeakHashMap @author ixenos 摘要:强引用.弱引用.WeakHashMap动态回收步骤 Reference引用对象 可获得的(reacha ...
- java到底是引用传递还是值传递?
今天我们来讲讲一个在学习中容易误解的问题,面试中也偶尔问到,java方法调用时到底是值传递还是引用传递? 首先,请大家来做一个判断题,下面的3个问题是否描述正确 1. java基本数据类型传递是值传递 ...
- Java四种引用--《深入理解Java虚拟机》学习笔记及个人理解(四)
Java四种引用--<深入理解Java虚拟机>学习笔记及个人理解(四) 书上P65. StrongReference(强引用) 类似Object obj = new Object() 这类 ...
- Java中的引用传递和值传递
Java中的引用传递和值传递 关于Java的引用传递和值传递,在听了老师讲解后,还是没有弄清楚是怎么一回事,于是查了资料,所以在这里与大家分享,有不对的地方,欢迎大家留言. java中是没有指针的,j ...
- Java中没有引用传递只有值传递(在函数中)
◆传参的问题 引用类型(在函数调用中)的传参问题,是一个相当扯的问题.有些书上说是传值,有些书上说是传引用.搞得Java程序员都快成神经分裂了.所以,我们最后来谈一下“引用类型参数传递”的问题. 如下 ...
随机推荐
- C++开源库,欢迎补充。
转载自:http://blog.csdn.net/kobejayandy/article/details/8681741 C++在"商业应用"方面,曾经是天下第一的开发语言,但这一 ...
- eclipse调试java技巧
详细内容请看: http://www.oschina.net/question/82993_69439
- 我之理解---计时器setTimeout 和clearTimeout
今天在写个图片切换的问题 有动画滞后的问题,才动手去查setTimeout 和clearTimeout.之前写的图片播放器也有类似的问题,有自动start按钮 和stop按钮, 其他都正常,问题出在每 ...
- php连接mysql报错——Fatal error: Call to undefined function mysql_connect() in
练习php连接mysql数据库 代码:mysql_connect("127.0.0.1:3306","root", ..... 浏览器报错:Fatal erro ...
- 【BZOJ2460】【BJOI2011】元素 [线性基]
元素 Time Limit: 20 Sec Memory Limit: 128 MB[Submit][Status][Discuss] Description 相传,在远古时期,位于西方大陆的 Ma ...
- Python爬虫学习 - day1 - 爬取图片
利用Python完成简单的图片爬取 最近学习到了爬虫,瞬时觉得很高大上,想取什么就取什么,感觉要上天.这里分享一个简单的爬取汽车之家文章列表的图片教程,供大家学习. 需要的知识点储备 本次爬虫脚本依赖 ...
- Shell Script Basics
https://developer.apple.com/library/mac/documentation/OpenSource/Conceptual/ShellScripting/shell_scr ...
- 关于iBatis-selectKey的一点笔记
技术前提:我们使用iBatis作为持久层方案 技术场景: 假设我们有两张表,一张主表Main,一张子表Sub,并且主表的主键是由数据库维护的自增长的主键,子表中有一个字段引用这个主键,那么当我 ...
- C#实现DES加密解密,AES加密解密
DES算法描述简介: DES是Data Encryption Standard(数据加密标准)的缩写.它是由IBM公司研制的一种加密算法,美国国家标准局于1977年公布把它作为非机要部门使用的数据加密 ...
- 欧拉函数O(sqrt(n))与欧拉线性筛素数O(n)总结
欧拉函数: 对正整数n,欧拉函数是少于或等于n的数中与n互质的数的数目. POJ 2407.Relatives-欧拉函数 代码O(sqrt(n)): ll euler(ll n){ ll ans=n; ...