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 ...
随机推荐
- Pyton基础-base64加解密
base64加密后是可逆的,所以url中传输参数一般用base64加密 import base64 s='username=lanxia&username2=zdd' new_s=base64 ...
- 2018-06-07 RF test 1 :TX Power test
Test item: 1.Output power: 屏蔽网房-同轴线-频谱仪 The radio circuitry, generally referred to as the Device U ...
- Linux syslogd
/********************************************************************************** * Linux syslogd ...
- NodeJS中 Path 模块
var path = require('path'); // 当发现有多个连续的斜杠时,会替换成一个: 当路径末尾包含斜杠时,会保留: // 在 Windows 系统会使用反斜杠. var p = p ...
- 将tomcat7解压版注册为windows系统服务
一.修改service.bat文件(...tomcat7\bin\service.bat) 该文件中共修改两处即可 ①:在文件的开头加入以下设置,分别是java的安装路径.Tomcat的安装路径及服务 ...
- [转]nodejs中的process模块--child_process.exec
1.process是一个全局进程,你可以直接通过process变量直接访问它. process实现了EventEmitter接口,exit方法会在当进程退出的时候执行.因为进程退出之后将不再执行事件循 ...
- bzoj 1670 Building the Moat护城河的挖掘 —— 凸包
题目:https://www.lydsy.com/JudgeOnline/problem.php?id=1670 单调栈维护凸包即可,用叉积判断: 维护上凸壳,然后把所有点的纵坐标翻转再求上凸壳即可, ...
- poj 1517 u Calculate e(精度控制+水题)
一.Description A simple mathematical formula for e is e=Σ0<=i<=n1/i! where n is allowed to go t ...
- SYS/BIOS实例分析
SYS/BIOS简介 SYS/BIOS是一个可扩展的实时内核(或者说是操作系统),其提供了许多模块化的APIs(应用程序接口),支持抢占式多线程,硬件抽象,实时分析和配置工具,其设计目的是为了最大限度 ...
- 从生成文件对比两种创建虚拟机的方式:boot from image和boot from bootable-volume
1. 创建bootable-volume(参考:http://docs.openstack.org/grizzly/openstack-compute/admin/content/instance-c ...