您的位置:首页 > Web前端

[GC系列] 不同强度reference 理解

2015-12-29 16:19 369 查看
GC在决定是否回收内存的时候,主要看该内存上的对象是否有被其它对象引用。为了更加细致地管理不同的引用。又搞出了下面4种引用类型:

1. 强引用

2. 弱(Soft)引用

3,Weak 引用

4. Panton引用

5. Finalizer应用

一开始很难理解,但从目的来分析,就比较容易了。

站在GC的角度,希望确定不同的引用情况下,是否可以回收内存。比如强引用情况下,GC绝不能把内存给回收了,就是不能把引用赋值为NULL。

如果发现对象被弱引用了,如果内存还比较充裕的情况下,也不会回收。如果是对象被Weak引用了,每一次GC都直接回收。对于Panton引用,在回收的同时,把引用存起来,并告诉应用程序,我已经回收了这个对象,应用程序可以根据这个信息,决定是不是要进行些其他后续工作。而Finalizer的引用,只有GC知道,应用程序不知道。所以GC可以完全决定什么时候,什么时间进行清理,根据不同的实现,可能回收方式完全随机不可控。所以,都不建议用Finalizer,不可控的事情,估计没哪个程序员喜欢。

站在程序的角度来看,有些时候,为了优化内存的使用,我们可能想告诉GC,有些内存一定不要回收,回收了就要出大事,程序可能没法玩了。有些内存如果内存空间不够了,也可以回收,因为这块内存不是这么要命。比如大型图片,如果被回收了,大不了显示不出来,并不影响程序其他功能。有些内存,可能使用并不频繁,局部性很大,GC的时候就可以回收。但是如果GC不回收,也有可能重新使用,说白了就是GC回不回收无所谓的。而有些时候,程序员想在对象被回收的时候得到通知,好方便搞些小动作,比如数据库连接对象被回收的时候,程序员想明确地关闭系统资源。这些程序员需求正好对应上面的Strong,Soft,Weak和Phanton引用。

对于Phanton引用,由于功能类似Finalizer,而Finalizer的对象,程序员是不可能再使用的,所以Phanton引用的对象,程序员也不可能得到。如果想得到引用的对象,只能用soft/weak引用。但Soft/Weak引用的对像被GC回收的时间是不确定的,所以在get对应对象的时候,要判断下是否为空。

Soft/weak给了GC根据情况进行内存回收的指示,说白了就是程序员和GC的协商,类似说,GC大哥,某个对象对于我来说比较重要,不到万不得已,不要回收,那么就用Soft引用。如果GC在万不得已的情况下回收了,程序员也能知晓。比如图片显示程序,如果图片被GC万不得已给回收了,那么程序员可以重新加载分辨率比较低的图片。这样不会影响程序的基本功能。用户也不会埋怨,谁让你用了弱的设备呢? 有些对象重复创建成本比较低,GC回收后继续使用的可能性也比较低,这个时候就使用weak引用。GC大哥你回收吧,无所谓,我可能也不一定使用。即使要使用,我重新创建呗。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  java 内存