Linux安全网 - Linux操作系统_Linux 命令_Linux教程_Linux黑客

会员投稿 投稿指南 本期推荐:
搜索:
您的位置: Linux安全网 > Linux集群 > Architecture > » 正文

理解 Java 的 GC 与 幽灵引用

来源: 未知 分享至:

http://www.iteye.com/topic/401478

Java 中一共有 4 种类型的引用 : StrongReference、 SoftReference、 WeakReference 以及 PhantomReference (传说中的幽灵引用 呵呵),
这 4 种类型的引用与 GC 有着密切的关系, 让我们逐一来看它们的定义和使用场景 :

1. Strong Reference

StrongReference 是 Java 的默认引用实现, 它会尽可能长时间的存活于 JVM 内, 当没有任何对象指向它时 GC 执行后将会被回收

  1. @Test
  2. public void strongReference() {
  3. Object referent = new Object();
  4. /**
  5. * 通过赋值创建 StrongReference
  6. */
  7. Object strongReference = referent;
  8. assertSame(referent, strongReference);
  9. referent = null;
  10. System.gc();
  11. /**
  12. * StrongReference 在 GC 后不会被回收
  13. */
  14. assertNotNull(strongReference);
  15. }
	@Test
	public void strongReference() {
		Object referent = new Object();
		
		/**
		 * 通过赋值创建 StrongReference 
		 */
		Object strongReference = referent;
		
		assertSame(referent, strongReference);
		
		referent = null;
		System.gc();
		
		/**
		 * StrongReference 在 GC 后不会被回收
		 */
		assertNotNull(strongReference);
	}
	





2. WeakReference & WeakHashMap

WeakReference, 顾名思义, 是一个弱引用, 当所引用的对象在 JVM 内不再有强引用时, GC 后 weak reference 将会被自动回收

  1. @Test
  2. public void weakReference() {
  3. Object referent = new Object();
  4. WeakReference<Object> weakRerference = new WeakReference<Object>(referent);
  5. assertSame(referent, weakRerference.get());
  6. referent = null;
  7. System.gc();
  8. /**
  9. * 一旦没有指向 referent 的强引用, weak reference 在 GC 后会被自动回收
  10. */
  11. assertNull(weakRerference.get());
  12. }
	@Test
	public void weakReference() {
		Object referent = new Object();
		WeakReference<Object> weakRerference = new WeakReference<Object>(referent);
	
		assertSame(referent, weakRerference.get());
		
		referent = null;
		System.gc();
		
		/**
		 * 一旦没有指向 referent 的强引用, weak reference 在 GC 后会被自动回收
		 */
		assertNull(weakRerference.get());
	}
	




WeakHashMap 使用 WeakReference 作为 key, 一旦没有指向 key 的强引用, WeakHashMap 在 GC 后将自动删除相关的 entry

  1. @Test
  2. public void weakHashMap() throws InterruptedException {
  3. Map<Object, Object> weakHashMap = new WeakHashMap<Object, Object>();
  4. Object key = new Object();
  5. Object value = new Object();
  6. weakHashMap.put(key, value);
  7. assertTrue(weakHashMap.containsValue(value));
  8. key = null;
  9. System.gc();
  10. /**
  11. * 等待无效 entries 进入 ReferenceQueue 以便下一次调用 getTable 时被清理
  12. */
  13. Thread.sleep(1000);
  14. /**
  15. * 一旦没有指向 key 的强引用, WeakHashMap 在 GC 后将自动删除相关的 entry
  16. */
  17. assertFalse(weakHashMap.containsValue(value));
  18. }
	@Test
	public void weakHashMap() throws InterruptedException {
		Map<Object, Object> weakHashMap = new WeakHashMap<Object, Object>();
		Object key = new Object();
		Object value = new Object();
		weakHashMap.put(key, value);
	
		assertTrue(weakHashMap.containsValue(value));
		
		key = null;
		System.gc();
		
		/**
		 * 等待无效 entries 进入 ReferenceQueue 以便下一次调用 getTable 时被清理
		 */
		Thread.sleep(1000);
		
		/**
		 * 一旦没有指向 key 的强引用, WeakHashMap 在 GC 后将自动删除相关的 entry
		 */
		assertFalse(weakHashMap.containsValue(value));
	}
	
                
               



               

            

Tags:
分享至:
最新图文资讯
1 2 3 4 5 6
验证码:点击我更换图片 理智评论文明上网,拒绝恶意谩骂 用户名:
关于我们 - 联系我们 - 广告服务 - 友情链接 - 网站地图 - 版权声明 - 发展历史