浅谈Java中的弱引用_第1页
浅谈Java中的弱引用_第2页
浅谈Java中的弱引用_第3页
浅谈Java中的弱引用_第4页
浅谈Java中的弱引用_第5页
已阅读5页,还剩3页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

本文格式为Word版,下载可任意编辑——浅谈Java中的弱引用浅谈Java中的弱引用

不久之前,我面试了一些求职Java高级开发工程师的应聘者。我往往会面试他们说,“你能给我介绍一些Java中得弱引用吗?”,假设面试者这样说,“嗯,是不是垃圾回收有关的?”,我就会根本合意了,我并不期望回复是一篇诘究本末的论文描述。

然而事与愿违,我很惊诧的察觉,在将近20多个有着平均5年开发阅历和高学历背景的应聘者中,俨然只有两个人知道弱引用的存在,但是在这两个人之中只有一个人真正了解这方面的学识。在面试过程中,我还尝试提示一些东西,来看看有没有人突然说一声“原来是这个啊”,结果很是让我消沉。我开头困惑,为什么这块的学识如此不被重视,终究弱引用是一个很有用途的特性,况且这个特性已经在7年前Java1.2发布时便引入了。

好吧,这里我不期望你看完本文之后成为一个弱引用方面的专家,但是我认为至少你理应了解什么是弱引用,如何使用它们,并且什么场景使用。既然它们是一些不知名的概念,我简朴就着前面的三个问题来说明一下。

强引用StrongReference

强引用就是我们经常使用的引用,其写法如下:

复制代码代码如下:

StringBufferbuffer=newStringBuffer;

上面创造了一个StringBuffer对象,并将这个对象的(强)引用存到变量buffer中。是的,就是这个小儿科的操作(请原谅我这样的说法)。强引用最重要的就是它能够让引用变得强(Strong),这就抉择了它和垃圾回收器的交互。概括来说,假设一个对象通过一串强引用链接可到达Stronglyreachable,它是不会被回收的。假设你不想让你正在使用的对象被回收,这就正是你所需要的。

但是强引用如此之强

在一个程序里,将一个类设置成不成被扩展是有点不太常见的,当然这个完全可以通过类标记成final实现。或者也可以更加繁杂一些,就是通过内部包含了未知数量概括实现的工厂方法返回一个接口Interface。举个例子,我们想要使用一个叫做Widget的类,但是这个类不能被继承,所以无法增加新的功能。

但是我们假设想追踪Widget对象的额外信息,我们该怎么办?假设我们需要记录每个对象的序列号,但是由于Widget类并不包含这个属性,而且也不能扩展导致我们也不能增加这个属性。其实一点问题也没有,HashMap完全可以解决上述的'问题。

复制代码代码如下:

serialNumberMap.putwidget,widgetSerialNumber;

这外观看上去没有问题,但是widget对象的强引用很有可能会引发问题。我们可以确信当一个widget序列号不需要时,我们理应将这个条目从map中移除。假设我们没有移除的话,可能会导致内存泄露,亦或者我们手动移除时删除了我们正在使用的widgets,会导致有效数据的损失。其实这些问题很类似,这就是没有垃圾回收机制的语言管理内存时常遇到的问题。但是我们不用去惦记这个问题,由于我们使用的时具有垃圾回收机制的Java语言。

另一个强引用可能带来的问题就是缓存,尤其是像图片这样的大文件的缓存。假设你有一个程序需要处理用户供给的图片,通常的做法就是做图片数据缓存,由于从磁盘加载图片代价很大,并且同时我们也想制止在内存中同时存在两份一样的图片数据。

缓存被设计的目的就是制止我们去再次加载哪些不需要的文件。你会很快察觉在缓存中会一向包含一个到已经指向内存中图片数据的引用。使用强引用会强制图片数据留在内存,这就需要你来抉择什么时候图片数据不需要并且手动从缓存中移除,进而可以让垃圾回收器回收。因此你再一次被强制做垃圾回收器该做的工作,并且人为抉择是该清理到哪一个对象。

弱引用WeakReference

弱引用简朴来说就是将对象留在内存的才能不是那么强的引用。使用WeakReference,垃圾回收器会帮你来抉择引用的对象何时回收并且将对象从内存移除。创造弱引用如下:

复制代码代码如下:

eakReferenceweakWidget=newWeakReferencewidget;

使用weakWidget.get就可以得到真实的Widget对象,由于弱引用不能阻挡垃圾回收器对其回收,你会察觉(当没有任何强引用到widget对象时)使用get时突然返回null。

解决上述的widget序列数记录的问题,最简朴的手段就是使用Java内置的WeakHashMap类。WeakHashMap和HashMap几乎一样,唯一的识别就是它的键(不是值!!!)使用WeakReference引用。当WeakHashMap的键标记为垃圾的时候,这个键对应的条目就会自动被移除。这就制止了上面不需要的Widget对象手动删除的问题。使用WeakHashMap可以很便捷地转为HashMap或者Map。

引用队列ReferenceQueue

一旦弱引用对象开头返回null,该弱引用指向的对象就被标记成了垃圾。而这个弱引用对象(非其指向的对象)就没有什么用了。通常这时候需要举行一些清理工作。譬如WeakHashMap会在这时候移除没用的条目来制止保存无限制增长的没有意义的弱引用。

引用队列可以很轻易地实现跟踪不需要的引用。当你在构造WeakReference时传入一个ReferenceQueue对象,当该引用指向的对象被标记为垃圾的时候,这个引用对象会自动地参与到引用队列里面。接下来,你就可以在固定的周期,处理传入的引用队列,譬如做一些清理工作来处理这些没有用的引用对象。

四种引用

Java中实际上有四种强度不同的引用,从强到弱它们分别是,强引用,软引用,弱引用和虚引用。上面片面介绍了强引用和弱引用,下面介绍剩下的两个,软引用和虚引用。

软引用(SoftReference)

软引用根本上和弱引用差不多,只是相比弱引用,它阻拦垃圾回收期回收其指向的对象的才能强一些。假设一个对象是弱引用可到达,那么这个对象会被垃圾回收器接下来的回收周期销毁。但是假设是软引用可以到达,那么这个对象会停留在内存更时间上长一些。当内存缺乏时垃圾回收器才会回收这些软引用可到达的对象。

由于软引用可到达的对象比弱引用可达成的对象滞留内存时间会长一些,我们可以利用这个特性来做缓存。这样的话,你就可以节省了好多事情,垃圾回收器会关切当前哪种可到达类型以及内存的消耗程度来举行处理。

虚引用(PhantomReference)

与软引用,弱引用不同,虚引用指向的对象特别脆弱,我们不成以通过get方法来得到其指向的对象。它的唯一作用就是当其指向的对象被回收之后,自己被参与到引用队列,用作记录该引用指向的对象已被销毁。

当弱引用的指向对象变得弱引用可到达,该弱引用就会参与到引用队列。这一操作发生在对象析构或者垃圾回收真正发生之前。理论上,这个即将被回收的对象是可以在一个不符合模范的析构方法里面重新复活。但是这个弱引用会销毁。虚引用只有在其指向的对象从内存中移除掉之后才会参与到引用队列中。其get方法一向返回null就是为了阻拦其指向的几乎被销毁的对象重新复活。

虚引用使用场景主要由两个。它允许你知道概括何时其引用的对象从内存中移除。而实际上这是Java中唯一的方式。这一点尤其表现在处理类似图片的大文件的处境。当你确定一个图片数据对象理应被回收,你可以利用虚引用来判断这个对象回收之后在持续加载下一张图片。这样可以尽可能地制止可怕的内存溢出错误。

其次点,虚引用可以制止好多析构时的问题。finalize方法可以通过创造强引用指向快被销毁的对象来让这些对象重新复活。然而,一个重写了finalize方法的对象假设想要被回收掉,需要体验两个单独的垃圾收集周期。在第一个周期中,某个对象被标记为可回收,进而才能举行析构。但是由于在析构过程中仍有微弱的可能这个对象会重新复活。这种处境下,在这个对象真实销毁之前,垃圾回收器需要再次运行。由于析构可能并不是很实时,所以在调用对象的析构之前,需要体验数量不确定的垃圾收集周期。这就意味着在真正清理掉这个对象的时候可能发生很大的延迟。这就是为什么当大片面堆被标记成垃圾时还是会展现烦人的内存溢出错误。

使用虚引用,上述处境将引刃而解,当一个虚引用参与到引用队列时,你十足没有手段得到一个销毁了的对象。由于这时候,对象已经从内存中销毁了。由于虚引用不能被用作让其指向的对象重生,所以其对象会在垃圾回收的第一个周期就将被清理掉。

显而易见,finalize

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论