`
san_yun
  • 浏览: 2663910 次
  • 来自: 杭州
文章分类
社区版块
存档分类
最新评论

WeakReference(弱引用)和SoftReference(弱引用)

    博客分类:
  • java
 
阅读更多
如果你想写一个 Java 程序,观察某对象什么时候会被垃圾收集的执行绪清除,你必须要用一个 reference 记住此对象,以便随时观察,但是却因此造成此对象的 reference 数目一直无法为零, 使得对象无法被清除。

 java.lang.ref.WeakReference

  不过,现在有了 Weak Reference 之后,这就可以迎刃而解了。如果你希望能随时取得某对象的信息,但又不想影响此对象的垃圾收集,那么你应该用 Weak Reference 来记住此对象,而不是用一般的 reference。

 Soft Reference 虽然和 Weak Reference 很类似,但是用途却不同。 被 Soft Reference 指到的对象,即使没有任何 Direct Reference,也不会被清除。一直要到 JVM 内存不足时且 没有 Direct Reference 时才会清除,SoftReference 是用来设计 object-cache 之用的。如此一来 SoftReference 不但可以把对象 cache 起来,也不会造成内存不足的错误 (OutOfMemoryError)。我觉得 Soft Reference 也适合拿来实作 pooling 的技巧。


import java.lang.ref.SoftReference;
import java.lang.ref.WeakReference;
import java.util.HashMap;

public class Test {

	/**
	 * @param args
	 */
	public static void main(String[] args) {

		HashMap ref = new HashMap();
		ref.put("StrongRef", new Finalize("obj"));
		ref.put("SoftRef", new SoftReference(new Finalize("soft")));
		ref.put("WeakRef", new WeakReference(new Finalize("weak")));

		try {
			HashMap map = new HashMap();
			for (int i = 0; i < Integer.MAX_VALUE; i++) {
				map.put("KEY" + i, "VALUE" + i);
			}
		} catch (OutOfMemoryError oom) {
			System.out.println(" obj oom--->" + ref.get("StrongRef"));
			System.out.println("soft oom--->"
					+ ((SoftReference) ref.get("SoftRef")).get());
			System.out.println("weak oom--->"
					+ ((WeakReference) ref.get("WeakRef")).get());
		}
	}

	static class Finalize {

		private String name;

		public Finalize(String name) {
			super();
			this.name = name;
		}

		protected void finalize() throws Throwable {
			Runtime runtime = Runtime.getRuntime();
			System.out.println(this.name + " finalize"+".free:"+runtime.freeMemory()/1024+" total:"+runtime.totalMemory()/1024);
		}

		public String toString() {
			return this.name;
		}
	}

}


输出:
weak finalize.free:5332 total:7872
soft finalize.free:328 total:7872
obj oom--->obj
soft oom--->null
weak oom--->null
分享到:
评论

相关推荐

    SoftReference、WeakReference和PhantomRefrence分析和比较

    在 Java 中,引用类型分为强引用、软引用、弱引用和虚引用四种。强引用是我们最常用的引用类型,而软引用、弱引用和虚引用则是 Java 为我们提供的三种特殊的引用类型,它们可以和 GC 做交互,以满足不同的应用场景。...

    Java引用总结--StrongReference、SoftReference、WeakReference、PhantomRef

    虚引用与软引用和弱引用的一个区别在于:虚引用必须和引用队列(ReferenceQueue)联合使用。当垃圾回收器准备回收一个对象时,如果发现它还有虚引用,就会在回收对象的内存之前,把这个虚引用加入到与之关联的引用...

    Android中的软引用和弱引用

    在Android开发中,内存管理是优化应用性能的关键因素之一。为了解决内存溢出问题,开发者需要合理地管理对象的...不过,过度依赖软引用和弱引用也可能导致性能问题,因此在实际使用中,应结合具体需求和场景谨慎选择。

    Java中的软引用弱引用和虚引用.docx

    ### Java中的软引用、弱引用和虚引用详解 #### 一、引言 在Java开发过程中,特别是Android应用开发中,经常会遇到一个普遍的问题——内存溢出(OutOfMemory Error,简称OOM)。这个问题往往与如何有效地管理内存...

    Java中弱引用软引用虚引用及强引用的区别Java开发Ja

    强引用、弱引用、软引用和虚引用是四种不同的引用强度,它们在垃圾回收机制中扮演着不同的角色。了解这些引用类型对于优化内存使用、防止内存泄漏以及合理地控制对象生命周期至关重要。 1. **强引用(Strong ...

    Java 7之基础 - 强引用、弱引用、软引用、虚引用1

    然而,为了更好地控制内存,Java提供了不同类型的引用:强引用、弱引用、软引用和虚引用。这些引用类型允许程序员在特定场景下干预垃圾收集过程,以达到更精细的内存管理。 1. **强引用(Strong Reference)** - *...

    详解Java弱引用(WeakReference)的理解与使用

    Java 中的弱引用(WeakReference)是一种特殊的引用类型,它可以帮助我们更好地管理内存和避免内存泄漏。在 Java 中,当一个对象被创建时,它被放在堆(Heap)中。当垃圾回收器(GC)运行时,如果发现没有任何引用...

    Java对象的强、软、弱和虚引用1

    Java对象的引用类型是Java内存管理中的重要概念,特别是在JDK 1.2及后续版本中引入了四种级别的引用:强引用、软引用、弱引用和虚引用,以提供更精细的控制对象生命周期的能力。 1. **强引用(StrongReference)**: ...

    强应用软引用弱引用与垃圾收集的关系1

    本文将深入探讨强引用、软引用、弱引用以及幻象引用这四种引用类型,以及它们与垃圾收集的关系。 1. **强引用(Strong Reference)**: - 强引用是Java中最常见的引用类型,它代表了一个对象的直接访问路径。只要...

    Java中弱引用和软引用的区别以及虚引用和强引用介绍

    强引用、弱引用、软引用和虚引用这四种引用类型提供了不同的对象生命周期管理策略。下面将详细介绍这些引用的区别及其应用场景。 1. **强引用(Strong Reference)** - 强引用是最常见的引用类型,如普通变量引用。...

    软弱虚引用_转

    在Java的lang.ref包中,提供了SoftReference类、WeakReference类和PhantomReference类来分别代表软引用、弱引用和虚引用。此外,ReferenceQueue类表示引用队列,可以与这三种引用类联合使用,用于跟踪垃圾回收器回收...

    拓胜技术专家教你如何深入理解Java四种引用类型

    Java中的四种引用类型是Java内存管理的重要组成部分,它们分别是强引用(StrongReference)、软引用(SoftReference)、弱引用(WeakReference)和虚引用(PhantomReference)。每种引用类型具有不同的特点和用途,...

    Java中的强软弱虚引用

    综上所述,Java中的四种引用类型按照引用强度由高到低依次是强引用、软引用、弱引用和虚引用。每种引用都有其适用场景: - **强引用**:用于保持对象的生命周期,确保对象不被垃圾回收。 - **软引用**:用于实现内存...

    Java对象的引用.pdf

    通过弱引用、软引用和虚引用,我们可以对对象进行不同级别的引用强度控制,并且可以借助引用队列来了解对象的回收情况。这些工具对于开发内存敏感的应用程序特别重要,比如那些需要大量缓存或者处理大对象的应用。...

    java 常见的四种引用

    ### Java 常见的四种引用...强引用确保对象不会被意外回收,而软引用和弱引用于内存敏感的场景非常有用。虚引用则主要用于监控对象的垃圾回收情况。正确理解和使用这些引用类型对于优化Java应用程序的性能至关重要。

    Java的四种引用

    从JDK 1.2版本开始,Java引入了一种更为精细的引用类型管理机制,通过四种不同的引用类型:强引用、软引用、弱引用和虚引用,让开发者能够更加灵活地控制对象的生命周期。这种机制不仅提升了Java应用程序对内存使用...

    referenceInJava:Java强引用,软引用,弱引用以及虚引用测试项目

    这个"referenceInJava"项目专注于探讨四种不同类型的引用:强引用、软引用、弱引用和虚引用。这些引用类型与垃圾收集(Garbage Collection, GC)机制密切相关,对于优化内存使用和防止内存泄漏至关重要。 1. **强...

    如何解决Java的循环引用问题

    现在,即使A和B互相持有弱引用,只要外部没有其他强引用,它们都可以被正常回收。 2. 使用软引用(SoftReference): 软引用与弱引用类似,但其强度稍大。软引用在系统内存不足时会被回收,而弱引用则是在垃圾回收...

    Android 软引用和弱引用详解及实例代码

    软引用和弱引用是Java语言提供的两种非强引用类型,它们在内存管理中扮演着重要角色,尤其在处理大量对象和缓存策略时。本文将深入讲解软引用(SoftReference)和弱引用(WeakReference)的概念、区别以及在Android...

Global site tag (gtag.js) - Google Analytics