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解析 ...
一周排行
  • 高并发下iptables丢包导致网络变慢解决方法   很多人估计遇到这个问题,开启iptables时,一旦网络连接并发较多,比如5000个以上,就发现网络响应变得很慢, 这时syslog中出现大量以下日志:   ip ...
  • Web安全扫描器Netsparker v3.5 破解版 Netsparker是一款综合型的web应用安全漏洞扫描工具,它分为专业版和免费版,免费版的功能也比较强大.Netsparker与其他综合性的web应用安全扫描 ...
  • 使用Alter Database语句,在各启动模式间切换.   1.从NoMount模式切换到Mount模式(没有从mount切换到nomount的):   命令:ALTER DATABASE MOUNT;   2. ...
  • 7月1日消息,国内分类信息网站赶集网宣布,赶集网交友平台正式上线.该平台主打真实可靠的同城交友,旨在让更多单身男女找到适合自己的另一伴.与一般婚恋交友网站截然不同的是,赶集网交友平台基础服务全部免费. 一个是国内最大 ...
  • 在个别业务中,可能需要根据关联表与主表中的关联关系进行连接才能得到想要的结果, 这有点像条件编译. 符合条件的才去做关联,不符合条件的就不做关联(或说让关联条件失败)   环境: oracle 请看代码: Sql代码 ...
  • 1.下面的( )不是衡量计算机主要性能的指标. A.字长 B.运算速度 C.主频 D.硬盘的大小 参考答案:D 2.8237各个通道的优先权可以采用循环的方式,在这种方式下,刚刚被服务过的通道的优先级变为( ) A. ...
  • 目前很多企业信息化系统都有自己的监控平台和监控手段,无论是采用哪种手段去实现对系统的实时监控和故障告警,大多采用的方式也只有两种:集中式监控和分布式监控.本文作者根据自身公司监控存在的问题,总结了一些经验并提出一些在 ...
  • 近日一条关于苹果市值超过中国石油(601857,收盘价9.94元),成为仅次于埃克森美孚的全球市值第二大公司的消息在市场热传. 对此有投资者表示,苹果作为全球优秀科技企业的代表,其股价的持续飙升,或将意味着10年前席 ...
  • 1.判断文件是否存在,file_exists("文件名") or die("no such file");2.set_error_hanlder("错误处理函数名称& ...
  • 昨日,中关村价格指数网发布的市场研究报告显示,IT市场景气指数从今年初开始一路下滑.9月份的IT市场景气指数更是下滑至1017.41点,同比下降了177.32点,价格指数创88.27点新低. 促销人气大不如前 借各种 ...