JAVA和Nginx 教程大全

网站首页 > 精选教程 正文

聊聊Java中的软引用、弱引用、虚引用

wys521 2024-11-14 19:28:17 精选教程 22 ℃ 0 评论

static字段的生命周期

static字段如果放入父类的话,只会产生一个static字段,因为static字段不能再子类中复制,static方法不会动态绑定,static方法不具有多态性。所以,尽量少用static,因为它和类的生命周期是一样的。

说明:如果想继续持有对某个对象的引用,希望以后还能够访问到该对象,但是也希望能够允许垃圾回收器释放它,这时就应该使用Reference对象(三个继承自抽象类Reference的类:SoftReference、WeakReference、PhantomReference)。这样,你可以继续使用该对象,而在内存消耗殆尽的时候又允许释放该对象

软引用

软引用(SoftReference):如果一个对象只具有软引用,那就类似于可有可无的生活用品。如果内存空间足够,垃圾回收器就不会回收它,如果内存空间不足了,就会回收这些对象的内存。只 要垃圾回收器没有回收它,该对象就可以被程序使用。软引用可用来实现内存敏感的高速缓存。 软引用可以和一个引用队列(ReferenceQueue)联 合使用,如果软引用所引用的对象被垃圾回收,Java虚拟机就会把这个软引用加入到与之关联的引用队列中。

弱引用

弱引用(WeakReference):如果一个对象只具有弱引用,那就类似于可有可无的生活用品。弱引用与软引用的区别在于:只具有弱引用的对象拥有更短暂的生命周期。在垃圾回收器线程扫描它所管辖的内存区域的过程中,一旦发现了只具有弱引用的对象,不管当前内存空间足够与否,都会回收它的内存。不过,由于垃圾回收器是一个优先级很低的线程, 因此不一定会很快发现那些只具有弱引用的对象。 弱引用可以和一个引用队列(ReferenceQueue)联合使用,如果弱引用所引用的对象被垃圾回收,Java虚拟机就会把这个弱引用加入到与之关联的引用队列中。 canonicalizing mappings(规范映射),允许垃圾回收期自动清理“键”(或“值”)。垃圾回收期并不会总在第一次就找到弱引用,而可能要找好几次才能找到。

虚引用

虚引用(PhantomReference):"虚引用"顾名思义,就是形同虚设,与其他几种引用都不同,虚引用并不会决定对象的生命周期。如果一个对象仅持有虚引用,那么它就和没有任何引用一样,在任何时候都可能被垃圾回收。 虚引用主要用来跟踪对象被垃圾回收的活动。虚引用与软引用和弱引用的一个区别在于:虚引用必须和引用队列 (ReferenceQueue)联合使用。当垃圾回收器准备回收一个对象时,如果发现它还有虚引用,就会在回收对象的内存之前,把这个虚引用加入到与之 关联的引用队列中。程序可以通过判断引用队列中是否已经加入了虚引用,来了解被引用的对象是否将要被垃圾回收。程序如果发现某个虚引用已经被加入到引用队列,那么就可以在所引用的对象的内存被回收之前采取必要的行动。


软引用、弱引用和虚引用的对比

1、对于垃圾回收机制来说,判断一个对象是否可回收的标准就在于该对象是否被引用。

2、强引用和软引用,软引用的实现,软引用的好处。

3、虚引用有什么用?怎么用?

虚引用就是专门用来使用引用队列的一种引用,当垃圾回收器回收你的对象的时候,如果该对象被虚引用引用了,就会把虚引用放入队列。其实就是让你知道该对象被收了,仅此而已。


看下面这个例子:

会依次输出

Soft

Soft

Weak

null

null

执行finalize 回收对象:Weak

null

执行finalize 回收对象:Phantom

Tags:

本文暂时没有评论,来添加一个吧(●'◡'●)

欢迎 发表评论:

最近发表
标签列表