对象引用JAVA 各种reference和垃圾回收机制
2013-05-20 20:13
453 查看
时间紧张,先记一笔,后续优化与完善。
明天好好学习了一下java中的各种reference.
一共分为以下几种:
1. 强引用
2. 软引用 SoftReference
3. 弱引用 WeakReference
4. 虚引用 PhantomReference
5. FinalReference 全部实现finalize()方法的对象
一下是Oracle JDK. IBM的JDK会有些不同。
强引用:
一般程序都在使用。请求太多时,会有OutOfMemory异常。gc不会主动释放。
软引用:
gc主动释放。不会有OutOfMemory异常,但是在垃圾回收之前/finalize()之前就会放入到引用队列 ReferenceQueue.
适合作为cache.
弱引用:
gc主动释放。不会有OutOfMemory异常,但是在垃圾回收之前/finalize()之前就会放入到引用队列 ReferenceQueue.
每日一道理
书籍好比一架梯子,它能引领人们登上文化的殿堂;书籍如同一把钥匙,它将帮助我们开启心灵的智慧之窗;书籍犹如一条小船,它会载着我们驶向知识的海洋。
适合作为Cache, 并且这里的意思为:如果能在内存中看到这个cache对象最好,看不到,load这个对象也不会损失很多效率。
虚引用:
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 部门做技术工作”。
“没错”,地面上的人说到,“你是怎么知道的?”
“呵呵”,热气球上的人说,“你告诉我的每件事在技术上都是对的,但对都没 有用”。
地面上的人说,“你一定是管理层的人”。
“没错”,热气球上的人说,“可是你是怎么知道的?”
“呵呵”,地面上的那人说到,“你不知道你在哪里,你也不知道你要去哪,你 总希望我能帮你。你现在和我们刚见面时还在原来那个地方,但现在却是我 错了”。
明天好好学习了一下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 部门做技术工作”。
“没错”,地面上的人说到,“你是怎么知道的?”
“呵呵”,热气球上的人说,“你告诉我的每件事在技术上都是对的,但对都没 有用”。
地面上的人说,“你一定是管理层的人”。
“没错”,热气球上的人说,“可是你是怎么知道的?”
“呵呵”,地面上的那人说到,“你不知道你在哪里,你也不知道你要去哪,你 总希望我能帮你。你现在和我们刚见面时还在原来那个地方,但现在却是我 错了”。
相关文章推荐
- java 垃圾回收机制 引用类型
- java 内存回收管理机制——Reference中四种引用方式
- Java深度历险(四)——Java垃圾回收机制与引用类型
- java 垃圾回收机制和各种实现算法
- Java垃圾回收机制与引用类型(转)
- Java深度历险(四)——Java垃圾回收机制与引用类型
- Java垃圾回收机制与引用类型
- 【Java垃圾回收机制与引用类型】
- Java深度历险(四)——Java垃圾回收机制与引用类型
- jvm垃圾收集器回收什么样的对象以及各种引用
- 面向对象_引用类型_内存分析_垃圾回收JAVA028-033
- JVM(3)对象A和B循环引用,最后会不会不被GC回收?-------关于Java的GC机制
- Java的垃圾回收机制,GC,和变量的创建和删除的关系(即变量的作用域,for循环中的某个变量,出了for循环再引用就会报错了,因为该变量已经被从内存中删掉了)
- 记录Java的垃圾回收机制和几种引用
- Java对象的生命周期与垃圾回收以及四种引用
- Java深度历险(四)——Java垃圾回收机制与引用类型
- Java基础复习笔记 对象状态、引用种类、垃圾回收形式02
- java实现面向对象和javaScript基于对象的区别&java垃圾回收机制和其他编程语言的比较
- Java垃圾回收机制与引用类型
- Java垃圾回收机制与引用类型