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解析 ...
一周排行
  • PageAdmin是一款优秀的网站管理系统,在搭建环境时可能会遇到一些问题,下面小编为大家提供了IIS的简单配置方法,希望能帮助大家. PageAdmin是一款优秀的网站管理系统,在搭建环境时可能会遇到一些问题,官方 ...
  • 十七道海量数据处理面试题与Bit-map具体解释作者:小桥流水,redfox66,July.前言    本博客内以前整理过有关海量数据处理的10道面试题(十道海量数据处理面试题与十个方法大总结),此次除了反复了之前的 ...
  • 近日收到易网邀请,下午茶会,同聊自媒体发展.欣然前往,见到会各家大牛云集.当前各大门户对自媒体的争夺呈愈演愈烈的趋势,易网云阅读选择在现在这个时机开邀,目的何在?如何与别家竞争?这是否是丁磊的心血来潮?茶会两小时有余 ...
  • 属性: Attributes 存储节点的属性列表(只读)childNodes 存储节点的子节点列表(只读)dataType 返回此节点的数据类型Definition 以DTD或XML模式给出的节点的定义(只读)Doc ...
  •  Problem Description 看病要排队这个是地球人都知道的常识. 不过经过细心的0068的观察,他发现了医院里排队还是有讲究的.0068所去的医院有三个医生(汗,这么少)同时看病.而看病的人病情有轻 ...
  • 目录 1.nginx软件安装 2.nginx proxy负载均衡搭建过程 3.不同域名站点分离 4.WEB日志客户端IP记录 5.根据扩展名实现服务器的动静分离 6.http proxy参数 7.Location指令 ...
  •   <input type = "text" id="football" /> 对上面获取焦点. 1.获取dom对象 var domFocus = document ...
  • 轻快的VIM(五):   轻快的VIM(四):修改 http://www.2cto.com/os/201212/180024.html   操作相同文本的时候尤其有效,在Windows中我们都习惯了先用鼠标选择文本 ...
  •   这三个类相互有关联,但是有不尽相同,首先从名字上看,QDir 和 QDirIterator 是针对于文件目录的,也就是文件夹,我们知道,对于一个文件夹,可以包含很多文件,也可以包含其他文件夹,通常是一个树的结构. ...
  • 一.环境说明 我用的是eclipse3.3.2,并安装了myeclipse的插件. 二.工程文件说明 一共三个文件夹: javacode:存放java源文件,包含多个子文件夹,每个子文件夹表示一个单独的模块,里面存放 ...