`
jswing
  • 浏览: 10862 次
社区版块
存档分类
最新评论

java里的弱引用

 
阅读更多
真是惭愧啊,搞了好几年Java,居然才知道Java里的弱引用!
"Java拥有垃圾回收机制,我们不需要手工释放对象",在讲到java的垃圾回收时,老师们总是这样一句带过。似乎Java真的很智能(实际上确实很智能),但是有时候她的垃圾回收机制并不能很好的理解我们的意图,考虑这么一种情况:

有一个Swing面板JPanel中有一个成员变量obj,窗体加载这个JPanel的时候,将obj加入一个全局map(static类的static属性)中,如果JPanel被卸载了,obj会被回收吗?
 
我们肯定希望obj会被回收,因为JPanel已经被卸载了,作为成员变量的obj也就没有存在的意义了。
 
但是,实际上,这个obj不会被回收,因为它还被那个全局的map引用!这还不是最糟糕的,万一这个obj还引用其它对象,这些对象也一律不会被回收,这就造成了很大的内存浪费。幸运的是,java提供了WeakReference解决这个问题。看下面的代码:
public class Test {
    public static Map map=new HashMap();
    public static void main(String[] args){
        MyObject obj=new MyObject("obj1");
        map.put("obj1",obj);
        test();
    }
    static void test(){
        Thread t=new Thread(new Runnable() {
            @Override
            public void run() {
                int i=0;
                while (true){
                    System.out.println(i++);
                    System.gc();
                    try {
                        Thread.sleep(1000);
                    } catch (Exception e) {
                        e.printStackTrace();
                    }
                }
            }
        });
        t.start();
    }
}
class MyObject{
    String id;
    public MyObject(String id){
        this.id=id;
    }
    @Override
    public void finalize() {
        System.out.println(id + " is finalized");
    }
}

将MyObject类的一个实例(obj)放入一个全局map,程序跳入test方法后,每隔1s调用垃圾回收器,虽然此时已经超出了obj的作用域,但是因为map还引用着obj,所以它不会被回收。

修改一下代码,将map.put("obj1",obj)改为map.put("obj1",new WeakReference(obj)),再运行程序,可以发现控制台很快输出"obj1 is finalized",说明对象被回收了。

有人可能疑惑,存入map的是WeakReference,要用obj怎么办?WeakReference提供了一个get方法,可以返回包装的对象,如果返回null,说明对象已经被回收了。

Java还提供了SoftReference(软引用),当内存紧张时,它所包装的对象可能被回收,API里说用它来做缓存不错,大家可以自行研究。
分享到:
评论

相关推荐

    java弱引用

    Java 弱引用 Java 弱引用是一种特殊类型的引用,它允许垃圾回收器在某些情况下回收对象,而不是像强引用那样坚持对象的存在。弱引用是 Java.lang.ref.WeakReference 类的实例,它们提供了一种方式来引用对象,而不...

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

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

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

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

    详解 JAVA 弱引用

    "JAVA 弱引用详解" JAVA 弱引用是JAVA语言中的一种特殊的引用类型,它使用WeakReference类来实现。弱引用是一种非必需对象的描述,它比软引用更弱。在发生GC时,只要发现弱引用,不管系统堆空间是否足够,都会将...

    java 常见的四种引用

    在Java中,为了更好地管理对象的生命周期,从JDK 1.2开始引入了四种不同级别的引用类型:强引用、软引用、弱引用和虚引用。每种引用类型都有其特定的应用场景,通过灵活运用这些引用类型,开发者可以在内存管理和...

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

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

    10分钟带你理解Java中的弱引用

    Java中的弱引用是一种特殊的引用类型,它在内存管理中扮演着重要的角色,特别是在避免内存泄漏和优化资源使用方面。本文将从三个方面详细解释弱引用:What(定义)、Why(使用原因)和How(使用方法)。 一、What...

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

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

    十分钟理解Java中的弱引用编程开发技术共3页.pdf.z

    Java中的弱引用编程开发技术是Java内存管理的一个重要概念,对于优化内存使用和防止内存泄漏具有关键作用。本文将深入探讨这一主题,帮助你在这十分钟内建立起对弱引用的理解。 首先,我们需要知道Java的内存区域...

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

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

    Android中的软引用和弱引用

    在这个过程中,软引用(Soft Reference)和弱引用(Weak Reference)是两种非常重要的工具,它们可以帮助我们避免内存泄漏,提高应用的内存效率。下面我们将深入探讨这两种引用类型及其在Android中的应用。 首先,...

    Java中的强软弱虚引用

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

    Java的四种引用

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

    Java 理论与实践:用弱引用堵住内存泄漏

    本月,负责保障应用程序健康的工程师 Brian Goetz 探讨了无意识的对象保留的常见原因,并展示了如何用弱引用堵住泄漏。  要让垃圾收集(GC)回收程序不再使用的对象,对象的逻辑 生命周期(应用程序使用它的时间...

    Java理论与实践:用弱引用堵住内存泄漏

    【Java理论与实践:用弱引用堵住内存泄漏】这篇文章除了介绍弱引用的概念,还探讨了如何使用弱引用来防止内存泄漏的问题。在Java编程中,内存泄漏并非像C++那样由忘记释放内存引起,而是由于对象生命周期与引用生命...

    Java对象的引用.pdf

    从JDK1.2开始,Java引入了四种不同级别的引用,分别是强引用、软引用、弱引用和虚引用,每种引用类型都有其特定的用途和行为。 1. **强引用**:这是最常见的引用类型,如果一个对象被强引用,垃圾收集器永远不会...

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

    弱引用是Java提供的一种特殊引用类型,它创建的对象可以通过WeakReference类获取。弱引用对象不会阻止垃圾回收器回收它所引用的对象。即使有弱引用指向一个对象,只要这个对象没有其他强引用,垃圾回收器就会在下一...

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

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

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

    Java 中强引用、软引用、弱引用概念解析 Java 中强引用、软引用、弱引用是 Java 语言中三种不同的引用类型,每种引用类型都有其特点和应用场景,以下是对这三种引用类型的详细解释: 强引用 强引用是使用最普遍的...

    java引用的demo

    本示例“java引用的demo”将深入探讨四种不同类型的引用:强引用、软引用、弱引用和虚引用。这些引用类型对于理解和优化内存管理至关重要,特别是在Android开发中,因为良好的内存管理能够提升应用性能并防止内存...

Global site tag (gtag.js) - Google Analytics