`
supben
  • 浏览: 330198 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

强引用,软引用,弱引用,虚引用

    博客分类:
  • JVM
阅读更多
测试对象
public class Obj {

	private final String name;

	public Obj(String name) {
		this.name = name;
	}

	@Override
	protected void finalize() throws Throwable {
		System.out.println("执行finalize方法" + name);
		super.finalize();
	}

	@Override
	public String toString() {
		return name;
	}
}



测试类
import java.lang.ref.PhantomReference;
import java.lang.ref.ReferenceQueue;
import java.lang.ref.SoftReference;
import java.lang.ref.WeakReference;

public class Test {

	public static void main(String[] args) {
		// hardTest();
		softTest();
		// weakTest();
		// phanTest();
	}

	public static void hardTest() {
		Obj hard = new Obj("hard");
		hard = null;
		System.gc();
		System.out.println(hard);
	}

	public static void softTest() {
		SoftReference<Obj> soft = new SoftReference<Obj>(new Obj("soft"));
		System.gc();
		System.out.println(soft.get());
	}

	public static void weakTest() {
		WeakReference<Obj> weak = new WeakReference<Obj>(new Obj("soft"));
		System.gc();
		System.out.println(weak.get());
	}

	public static void phanTest() {
		ReferenceQueue<Obj> rq = new ReferenceQueue<Obj>();
		PhantomReference<Obj> phan = new PhantomReference<Obj>(new Obj("phan"), rq);
		//这里没有调用system.gc();
		System.out.println(phan.get());
	}
}




测试环境:jdk1.6。
System.gc()表示建议JVM 进行垃圾回收,JVM 未必会执行。我们可以根据 thinking in java说的那样,用finalize()来监控他的执行。

上面4个方法的运行结果分别是
1.null
  执行finalize方法hard
或者
  执行finalize方法hard
  null
两者出现的比例大约为5:1

2.soft

3.null
  执行finalize方法weak
或者
  执行finalize方法weak
  null
两者出现的比例大约为3:1

4.null


结论:1.显式的把(强引用)对象置为null,会大大加大 垃圾回收执行频率。几乎只要我们给出建议,jvm就会回收。
2.对于软引用,如果不显式的置为null的话,和强引用差不多,垃圾回收不会执行。只会等到内存不足的时候才会执行。
3.对于弱引用,就算你不显式的把他置为null,垃圾回收也会立即执行。
4.虚引用,相当于null,不解释。

5.垃圾回收执行的时机是不可预知的。3和4的打印结果很好的说明了这点。

6.务必要注意到一个事实,本例子的结果是在app中只有一个对象运行的情况下得到的。
1
1
分享到:
评论
2 楼 yin520liang 2014-11-04  
WeakReference<Obj> weak = new WeakReference<Obj>(new Obj("soft"));  写错了~
1 楼 rxin2009 2012-11-01  
学习了,但是这里有两个问题想请教下:
1、第五条中是不是应该是1和3的打印结果呢,还是我的理解错了?
2、第六条中,app中有多个对象运行有什么区别吗?

相关推荐

    Java中的引用类型详解:强引用、软引用、弱引用与虚引用

    从JDK 1.2版本开始,Java引入了四种不同级别的引用:强引用(Strong Reference)、软引用(Soft Reference)、弱引用(Weak Reference)和虚引用(Phantom Reference)。这些引用类型提供了灵活的内存管理策略,允许...

    强引用、软引用、弱引用、虚引用1

    从Java SE2开始,Java引入了四种不同类型的引用:强引用、软引用、弱引用和虚引用,它们各自具有不同的特点和用途,有助于程序员更精细地控制对象的生命周期,并优化垃圾回收过程。 1. 强引用(Strong Reference) ...

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

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

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

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

    Java中的强软弱虚引用

    为了更好地理解和控制对象的生命周期,Java提供了四种不同类型的引用:强引用(Strong Reference)、软引用(Soft Reference)、弱引用(Weak Reference)以及虚引用(Phantom Reference)。每种引用都有其特定的...

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

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

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

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

    JVM面试题分享给需要的同学.zip

    JVM 垃圾回收 1.JVM的4种垃圾回收算法 ...10.强引用、软引用、弱引用、虚引用的区别? 1)强引用 软引用 弱引用 虚引用 11.堆栈的区别是什么? 12 对象的GC年龄最大多少?存储在哪 13 为什么GC分代年

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

    - 单例模式:可以在单例模式中使用弱引用来替代传统的强引用,使得单例对象能够在不再需要时被及时回收。 - 缓存管理:在某些不需要长期保持数据的情况下,可以使用弱引用作为缓存策略的一部分。 ##### 示例代码 `...

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

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

    强,软,弱,虚1

    本文将深入探讨四种引用类型:强引用、软引用、弱引用和虚引用。 首先,我们来理解强引用(Strong Reference)。强引用是最常见的引用类型,它代表了程序中的普通对象引用。当一个对象被强引用指向时,该对象被认为...

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

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

    Android中的软引用和弱引用

    由于弱引用不会阻止垃圾收集,所以使用弱引用的对象在被创建后会很快变得不可达,除非有其他强引用指向它。这在一定程度上保证了内存的有效利用,避免了不必要的内存占用。 在Android中,软引用和弱引用常用于图片...

    android安卓图片的三级缓存DEMO 三层缓存示例下载 强引用 软引用

    "android安卓图片的三级缓存DEMO 三层缓存示例下载 强引用 软引用"这个资源提供了对图片加载优化的一个常见实践——三级缓存机制的实现。下面将详细讲解这一知识点。 首先,我们来理解什么是图片的三级缓存。在...

    Java中强引用,软引用,弱引用概念解析

    Java 中强引用、软引用、弱引用概念解析 Java 中强引用、软引用、弱引用是 Java 语言...Java 中的强引用、软引用、弱引用和虚引用四种引用类型都有其特点和应用场景,选择合适的引用类型可以提高程序的性能和可读性。

    java四大引用

    java有四种引用类型:强引用、软引用、弱引用、虚引用 四大引用设计作用 ​ 因为java的内存分配和内存回收,都是由JVM去负责,一个对象是否可以被回收,主要看是否有引用指向此对象,即可达性分析 设计目的: 可以让...

    弱引用强引用支持区别

    弱引用强引用支持区别

    软弱虚引用_转

    Java中的引用类型分为四种级别,分别是强引用、软引用、弱引用和虚引用。在JDK1.2版本之前,对象的生命周期完全由强引用决定,即只要还有强引用指向一个对象,该对象就不会被垃圾回收器回收。但这种处理方式过于简单...

    Bitmap图片的三级缓存DEMO 三层缓存 强引用 软引用DEMO

    这里我们将深入探讨“三级缓存”、“强引用”和“软引用”这三个核心概念,并通过BitmapUtils三层缓存的实现来阐述它们如何协同工作。 首先,我们来看“三级缓存”。在Android应用中,图片缓存通常分为三部分:内存...

    java弱引用

    在 Java 中,引用可以分为四类:强引用、软引用、弱引用和虚引用(也称为精灵引用)。弱引用是其中的一种,它们允许垃圾回收器在某些情况下回收对象,而不是像强引用那样坚持对象的存在。 弱引用的工作原理是,当...

Global site tag (gtag.js) - Google Analytics