Java-软引用、弱引用、虚引用、WeakHashMap
2016-03-26 17:17
489 查看
SoftReference、WeakReference、PhantomReference、ReferenceQueue
1.SoftReference:对象只有软引用时,若内存空间充足时,不GC,内存空间紧张时,回收该对象2.WeakReference:对象只有弱引用时,当垃圾收集器扫描时,无论内存空间是否紧张都回收
3.PhantomReference:
4.ReferenceQueue:作为一个Java对象,SoftReference对象除了具有保存软引用的特殊性之外,也具有Java对象的一般性。所以,当软可及及象被回收之后,虽然这个SoftReference对象的get()方法返回null,但这个SoftReference对象已经不再具有存在的价值,需要一个适当的清除机制,避免大量SoftReference对象带来的内存泄漏。在java.lang.ref包里还提供了ReferenceQueue。如果在创建SoftReference对象的时候,使用了一个ReferenceQueue对象作为参数提供给SoftReference的构造方法,如:
ReferenceQueue queue = new ReferenceQueue(); SoftReference ref=new SoftReference(aMyObject, queue)
那么当这个SoftReference所软引用的aMyOhject被垃圾收集器回收的同时,ref所强引用 的SoftReference对象被列入ReferenceQueue。也就是说,ReferenceQueue中保存的对象是Reference对象,而且是已经失去了它所软引用的对象的Reference对象。另外从ReferenceQueue这个名字也可以看出,它是一个队列,当我们调用它的poll()方法的时候,如果这个队列中不是空队列,那么将返回队列前面的那个Reference对象。
下面的例子演示了垃圾收集弱引用,同时被收集的弱引用被加入ReferenceQueue中:
public class TestReference { private static ReferenceQueue< VeryBig > rq = new ReferenceQueue <VeryBig > (); public static void main (String [] args ) { WeakReference <VeryBig > sr = new WeakReference (new VeryBig ("" +1 ) , rq ); System .gc () ; Reference <VeryBig > ref = ( Reference <VeryBig >) rq .poll (); if ( ref != null ) { System .out . println( ref .get ()) ; } } } class VeryBig { private static final int SIZE = 1000000 ; private long [] la = new long [ SIZE] ; private String id ; VeryBig (String id) { this. id = id ; } public String toString() { return id; } ; protected void finalize() { System .out . println( "Finalizing" + id ); } } 输出: Finalizing1 或 Finalizing1 null
WeakHashMap:这种hashmap中存放了,键对象的弱引用,弱键对象只被该弱引用引用,垃圾收集时将被回收内存:
实例(键对象中id为3的倍数的对象被数组中的强引用引用,所有垃圾收集时不会被回收内存):class Element { private String ident; public Element (String id) { ident = id ; } public String toString () { return ident; } public int hashCode () { return ident. hashCode (); } public boolean equals ( Object obj ) { return obj instanceof Element && ident. equals((( Element ) obj ). ident ); } protected void finalize (){ System .out . println( "Finalizing "+ getClass() . getSimpleName() + " "+ ident ); } } class Key extends Element { public Key (String id){ super (id ) ; } } class Value extends Element { public Value ( String id ){ super (id ) ; } } public class TestReference { public static void main( String [] args ){ int size =1000 ; Key [] keys= new Key[ size ]; WeakHashMap map =new WeakHashMap () ; for (int i = 0; i < size ; i++ ){ Key k =new Key ( Integer. toString (i )) ; Value v =new Value ( Integer. toString (i )) ; if (i % 3== 0 ) keys [ i] = k; map. put (k , v) ; } System .gc () ; } }
相关文章推荐
- 基于SpringMVC+hibernate-validator实现实现动态签名验证
- springside 推荐的编程
- [Java]path与classpath
- mac下搭建java开发环境:eclipse
- Java JDK环境配置及说明
- Java并发编程之中断
- Java基础 常见List实现原理 - ArrayList
- Java substring的使用
- java的参数传递
- Java中使用jvisualvm进行可视化内存分析
- Eclipse中附加SWT组件
- java jmx 问题集锦
- eclipse与ndk结合
- java字符串的比较
- Spring--IOC
- MyEclipse、Eclipse优化设置
- 使用javah快速生成本地方法及生成so动态库文件
- java.lang.NoSuchMethodException 的解决方法们(转)
- Java的static关键字解析
- 20145215《Java程序设计》第4周学习总结