[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大哥你回收吧,无所谓,我可能也不一定使用。即使要使用,我重新创建呗。
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对世界各个时区(TimeZone)的通用转换处理方法(转载)
- java-注解annotation
- java-模拟tomcat服务器
- java-用HttpURLConnection发送Http请求.
- java-WEB中的监听器Lisener
- Android IPC进程间通讯机制
- Android Native 绘图方法
- Android java 与 javascript互访(相互调用)的方法例子
- 介绍一款信息管理系统的开源框架---jeecg
- 聚类算法之kmeans算法java版本
- java实现 PageRank算法
- PropertyChangeListener简单理解
- c++11 + SDL2 + ffmpeg +OpenAL + java = Android播放器
- 插入排序
- 冒泡排序
- 堆排序
- 快速排序
- 二叉查找树