您的位置:首页 > Web前端

对象引用JAVA 各种reference和垃圾回收机制

2013-05-20 20:13 453 查看
时间紧张,先记一笔,后续优化与完善。

明天好好学习了一下java中的各种reference.

一共分为以下几种:

1. 强引用

2. 软引用 SoftReference

3. 弱引用 WeakReference

4. 虚引用 PhantomReference

5. FinalReference 全部实现finalize()方法的对象

一下是Oracle JDK. IBM的JDK会有些不同。

强引用

String a = new String("A");

一般程序都在使用。请求太多时,会有OutOfMemory异常。gc不会主动释放。

软引用

SoftReference<String> a = new SoftReference<String>(new String("A"));
String real = a.get(); // if memory is near/equal to threshold of memory, real may be null.

gc主动释放。不会有OutOfMemory异常,但是在垃圾回收之前/finalize()之前就会放入到引用队列 ReferenceQueue.

适合作为cache.

弱引用

WeakReference<String> a = new WeakReference<String>(new String("A"));
String real = a.get(); // may null

gc主动释放。不会有OutOfMemory异常,但是在垃圾回收之前/finalize()之前就会放入到引用队列 ReferenceQueue.

每日一道理

书籍好比一架梯子,它能引领人们登上文化的殿堂;书籍如同一把钥匙,它将帮助我们开启心灵的智慧之窗;书籍犹如一条小船,它会载着我们驶向知识的海洋。

适合作为Cache, 并且这里的意思为:如果能在内存中看到这个cache对象最好,看不到,load这个对象也不会损失很多效率。

虚引用:

PhantomReference<String> a = new PhantomReference<String>(new String("A"));
String real = a.get(); // is always null

gc不会主动释放, 会有OutOfMemory。对象在垃圾回收/finalize()以后才会放入到ReferenceQueue中。这里会保证对象不会再次引用。也可以用于判断该对象是不是已从内存中移除。

FinalReference:

其实不能直接使用。这个的子类 Finalizer也不能直接使用。系统会在运行时启动FinalizerThread。 这个Thread用于清算ReferenceQueue中的对象。首先调用该对象finalize()方法,然后将引用赋值为null. 这样就解除了引用和对象的关系。这里的ReferenceQueue可以看做是以上各个引用都被最终放入到的queue对象。因为全部对象都有finalize()方法。

另外垃圾回收有两步,第一步确定垃圾回收的对象,第二步调用finalize()方法,将对象从内存中移除。在finalize()方法调用前,强引用是可以召回对象,使对象不会移除内存。这样会导致垃圾回收会反反复复回收多次,仍未能将该对象移除。但是如果使用虚引用,就可以确保,进入ReferenceQueue中的引用,其对象一定已移除内存。

参考:
http://www.ibm.com/developerworks/cn/java/j-lo-langref/ https://weblogs.java.net/blog/2006/05/04/understanding-weak-references http://yangguangfu.iteye.com/blog/849317
文章结束给大家分享下程序员的一些笑话语录: 问路

有一个驾驶热气球的人发现他迷路了。他降低了飞行的高度,并认出了地面 上的一个人。他继续下降高度并对着那个人大叫,“打扰一下,你能告诉我我 在哪吗?”

下面那个人说:“是的。你在热气球里啊,盘旋在 30 英尺的空中”。

热气球上的人说:“你一定是在 IT 部门做技术工作”。

“没错”,地面上的人说到,“你是怎么知道的?”

“呵呵”,热气球上的人说,“你告诉我的每件事在技术上都是对的,但对都没 有用”。

地面上的人说,“你一定是管理层的人”。

“没错”,热气球上的人说,“可是你是怎么知道的?”

“呵呵”,地面上的那人说到,“你不知道你在哪里,你也不知道你要去哪,你 总希望我能帮你。你现在和我们刚见面时还在原来那个地方,但现在却是我 错了”。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: