java 强引用、弱引用、软引用、虚引用 浅析

强引用(StrongReference):

强引用最常见, StringBuffer buffer=new StringBuffer();这条语句创建了一个stringBuffer类的对象,并用一个变量buffer存储对这个对象的引用,这就是一个强引用。变量持有的是这个对象的引用。通常,引用是一个对象的存储地址,如果一个对象具有强引用,GC绝不回收,哪怕内存不足,JVM抛出outofmemoryError使程序终止,也不会回收StrongReference。

JAVA不像c或者c++一样,java没有取地址符号,也米有解引用符号*或者-->,引用不同于指针,引用不能与整型进行相互转换,也不能进行增减操作。强引用是垃圾回收机制相关的。一般的,如果一个对象可以通过一些列的强引用引用到,那么就说明,它是不会被垃圾回收机制回收的。因为GC不会收回你正在使用的对象,如果一个对象,没有引用指向他,那么它就被认为是一个垃圾。


弱引用(WeakReference):

                      简单的说就是将对象留在内存的能力不是那么强的引用,不保证不被GC回收的对象,生命周期短,GC一旦发现只有弱引用的对象,就回收它的内存,但GC线程优先级比较低,不会很快发现只有弱引用的对象。

弱引用可以实现WeakHashMap类,和HashMap几乎一样,唯一的区别就是WeakHashMap的键使用WeakReference引用。当WeakHashMap的键被标记为垃圾的时候,这个键对应的条目也会被自动移除。WeakHashMap也可以方便的转为HahMap或者Map。如果没有任何强引用引用弱引用的对象的话,使用get()方法时候,很可能会返回null(除非GC还未发现) 弱引用是和引用队列(ReferenceQueue)相关联的,一旦弱引用开始返回null,该弱引用指向的对象被标记成了垃圾,而这个弱引用就没有什么用了。引用队列是跟踪不需要的引用,像上面这种情况的弱引用,JVM就把它加入到ReferenceQueue,然后,在固定的周期,便可以处理这个引用队列。


软引用(SoftReference): 如果一个对象只具有软引用,内存空间足够,GC不回收它,如果内存空间不足了,GC回收该对象的内存。

只要没回收,该对象就能被程序使用 。软引用可以用来实现内存敏感告诉缓存。(Soft references are for implementing memory-sensitive caches)


虚引用(PhantomReference): 顾名思义,形同虚设,它决定不了对象的生命周期,如果一个对象仅仅持有虚引用,那么它就和没有任何引用一样,在任何时候都可能被GC回收。

那么它的存在有什么意义呢?

用来跟踪对象被GC回收的活动,虚引用必须和引用队列联合使用。当GC准备回收一个对象时,如果发现它还有虚引用,就会在回收对象的内存之前,把这个虚引用加入到与之关联的引用队列中。程序可以通过判断引用队列中是否已经加入了虚引用,来了解被以引用对象是否要被回收 。如果发现已经加入到引用队列中,那么就在所引用的对象被回收前采取必要的行动了。

PhantomReference的get()方法总是返回null,所以你得不到它的引用对象。


三种类型的引用定义了三种不同的层次可达性级别,由强到弱排列如下:

      StrongReference>softReferenc>WeakReference>PhantomReference

更多相关文章
  • 故障现场: 当用户访问www.sinopecsales.com时出现访问异常,具体如下图所示: 故障分析: 访问其它网站正常,但是访问该网站出现问题,从DNS解析和路径跟踪来看网络并无异常,负载均衡策略和链路状态也正常.想到F5的工作原理,有可能是在会话处理上存在问题,所以从会话处理上入手,解决方法 ...
  • 目前Win10 Build 10240部分语言包已可在控制面板中下载,但是包括台湾繁体中文在内的一些语言包还不可用.不过对于很多用户来讲,已经升级到10240版本,并且是永久激活的,这是怎么办到呢?下面小编就为大家带来Win10准正式版10240如何永久激活图文教程,亲测成功 相信现在很多人的Win ...
  • 1 #include<stdio.h> 2 #include<queue> 3 #include<string.h> 4 using namespace std; 5 int step,t; 6 int visit[25]; 7 int map[25]; 8 in ...
  • 网站伴随着网络的快速发展而快速兴起,作为上网的主要依托,由于人们使用网络的频繁而变得非常的重要.由于企业需要通过网站呈现产品.服务.理念.文化,或向受众提供某种功能服务.因此网页设计必须首先明确设计站点的目的和用户的需求,从而做出切实可行的设计方案. 网页设计标准尺寸: 1.800*600下,网页宽 ...
  • 在开发的项目的时候,你是否经常遇到需要重复编写一些类似的代码,比如是否经常会使用 for.foreach ? 在编写这两个循环语句的时候,你是一个字符一个字符敲还是使用 Visual Studio 提供的Code Snippet 工具自动帮你生成呢? 神奇之处 你只需要在代码编辑器中输入for,就会 ...
  •   Digester不是jdk里面自带的,有依赖包:commons-beanutils.jar.commons-collections.jar.commons-digester.jar.commons-logging-1.1.3.jar.下载地址:点击打开链接   Digester底层采用SAX解析 ...
一周排行
  • 控制器端代码(都在同一个表中): using System; using System.Collections.Generic; using System.Linq; using System.Web; using ...
  • 1. Mahout0.9-Hadoop2.20-FPG关联规则算法 1.1. FPG函数 目前Mahout0.9 无fpg函数,0.9之前版本有,但是在0.9中可以找到fpg的jar包: mahout org.apa ...
  • 1.首先重启服务器 按 "e" 键进入下表 2.选择第一项再按 "e" 进入下表 3.选择第二项 再按 "e" 进入下表 4.输入 "1" ...
  • RHCS集群理论暨 最佳实践 什么是集群? 集群是一组(>2)相互独立的,通过高速网络互联的计算机组成的集合.群集一般可以分为科学集群,负载均衡集群,高可用性集群三大类. 科学集群是并行计算的基础.它对外就好象 ...
  • 北京,2013年3月22日 博通(Broadcom)公司宣布,中国两大设备制造商数码视讯和中兴已采用博通的C-DOCSIS EoC技术设计支持中国互联网.电视网和电信网三网融合的产品.博通公司和这些领先OEM厂商已于 ...
  • 发布在我的独立网站,欢迎移步访问 http://kesenhoo.github.io/blog/2013/04/06/android-training-performance-tips/ http://kesenho ...
  • 王莹作为"舶来品",众筹在国内尚属新鲜事物,更别说众筹里的细分领域"艺术众筹",虽然新鲜,但是被看好.我要艺术网创始人.CEO罗文表示,艺术众筹是纯互联网的艺术创作.流通.分享 ...
  •  如果你的数据库中某一个表中的数据满足以下几个条件,那么你就要考虑创建分区表了.       1.数据库中某个表中的数据很多.很多是什么概念?一万条?两万条?还是十万条.一百万条?这个,我觉得是仁者见仁.智者见智的问 ...
  • 原文:http://rubyqiu.php.blog.163.com/blog/static/8614152320098211576782/ 通常将类数组(Array-Like)arguments转换成数组可以采用以 ...
  • 用Firefox下载Scribefire next插件www.scribefire.com cnblogs添加方法: URL:http://www.cnblogs.com/[你的博客名] API为http://www ...