`
yznxing
  • 浏览: 370103 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
社区版块
存档分类
最新评论

weak,soft,phtom Reference,软,弱,虚引用!

    博客分类:
  • java
阅读更多

前面的简介:

strongReference:强引用

softReference:软引用。

weakReference:弱引用

phtomReference:虚引用

 

一:strongReference

String a = new String("hello world");
String b=a;

 咯,这里b就是个强引用咯。反正就是会一直指向那个String的。也就是大家最常用的。

 

二:softReference

String a = new String("hello world");
        
ReferenceQueue<String> queue = new ReferenceQueue<String>();
SoftReference<String> ref = new SoftReference<String>(a, queue);

 

    这些reference主要的作用就是体现在gc的时候了。softReference的作用是:

 

写道
当对象是Soft reference可达时,gc可能会向操作系统申请更多内存,而不是直接回收它,当实在没辙了才回收它。像cache系统,最适合用Soft reference。

 

    我的理解就是,GC对Soft reference 还是比较客气的,内存不够的时候才把它干掉,也就是在jvm抛出outOfMemory异常之前,会把这些都给回收掉,以空闲处内存。当内存不足的时候, 这些就会被无情的干掉了。

 

    现在我们来看下它的gc过后的效果。

 

 

import java.lang.ref.PhantomReference;
import java.lang.ref.ReferenceQueue;
import java.lang.ref.SoftReference;
import java.lang.ref.WeakReference;

/**
 * @author guoliang created TestReferenceMain.java
 * @since 2010-5-7 下午06:31:35
 */
public class TestReferenceMain {

    /**
     * @param args
     */
    public static void main(String[] args) {
        String a = new String("hello world");
        ReferenceQueue<String> queue = new ReferenceQueue<String>();
        SoftReference<String> ref = new SoftReference<String>(a, queue);
//        WeakReference<String> ref = new WeakReference<String>(a, queue);
//        PhantomReference<String> ref = new PhantomReference<String>(a, queue);
        a = null;
        System.gc();
        try {
            Thread.sleep(10000);
        } catch (InterruptedException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
        String value = ref.get();
        System.out.println(value);
        System.out.println(ref.isEnqueued());
        System.out.println(queue.poll());

    }

}
 

    输出结果为:

[Full GC 317K->169K(5056K), 0.1891790 secs]
hello world
false
null

 

 

    可以看出,虽然gc了,但是这个reference还是没有被回收,因为当前的内存还是充足的,大家可以在这里做个例子,

让它outOfMemory再来看看这个reference是否还在,我做过实验,是会没的,oh yeah!~

 

三:weakReference

String a = new String("hello world");
ReferenceQueue<String> queue = new ReferenceQueue<String>();
WeakReference<String> ref = new WeakReference<String>(a, queue);
 
写道
Weak reference,简单地说就是这个引用不会强到迫使对象必须保持在内存中。Gc不会碰Strong reference可达的对象,但可以碰weak reference可达的对象。

    简单的说:就是gc会蹂躏这种对象,一GC,发现这种对象没人引用了,就把丫的给回收了,不给你机会的。

代码来看看结果.

 

import java.lang.ref.PhantomReference;
import java.lang.ref.ReferenceQueue;
import java.lang.ref.SoftReference;
import java.lang.ref.WeakReference;

/**
 * @author guoliang created TestReferenceMain.java
 * @since 2010-5-7 下午06:31:35
 */
public class TestReferenceMain {

    /**
     * @param args
     */
    public static void main(String[] args) {
        String a = new String("hello world");
        
        ReferenceQueue<String> queue = new ReferenceQueue<String>();
//        SoftReference<String> ref = new SoftReference<String>(a, queue);
        WeakReference<String> ref = new WeakReference<String>(a, queue);
//        PhantomReference<String> ref = new PhantomReference<String>(a, queue);
        a = null;
        System.gc();
        try {
            Thread.sleep(10000);
        } catch (InterruptedException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
        String value = ref.get();
        System.out.println(value);
        System.out.println(ref.isEnqueued());
        System.out.println(queue.poll());

    }

}

 

   输出结果为:

 

 

[Full GC 317K->169K(5056K), 0.0074055 secs]
null
true
java.lang.ref.WeakReference@14318bb

 

    可以看到一不引用a,一gc,weakReference对应的就被回收了。

 

    后记:soga,弄完这个感觉还是不错的,以前很少去关注这个。然后就是在eclipse里面调用system.gc还是有用的,想要打出gc的详情可以 在ecliose的run的configure里面的arguments里面加上对应的参数:

 

   

 

 

 

 

  • 大小: 14.9 KB
2
0
分享到:
评论

相关推荐

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

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

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

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

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

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

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

    本文将深入探讨Java中三种特殊的引用类型——软引用(Soft Reference)、弱引用(Weak Reference)以及虚引用(Phantom Reference),并分析它们如何帮助我们更好地管理内存资源。 #### 二、基础知识回顾 在深入了解这三...

    Java中的强软弱虚引用

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

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

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

    Android中的软引用和弱引用

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

    强,软,弱,虚1

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

    函数weak属性理解_弱声明实例

    在C语言中,我们并没有直接的`weak`关键字,但可以通过其他方式模拟弱引用。例如,可以使用指针间接引用对象,而不增加其引用计数。在C++或Objective-C中,`weak`属性则是一个标准的特性,它允许创建一个不增加对象...

    Java功底之Reference

    2. **弱引用(Weak Reference)**:弱引用比软引用更弱,一旦发现一个对象只有弱引用,无论内存是否充足,垃圾收集器都会在下次GC时回收该对象。这使得弱引用非常适合用于构建不阻塞垃圾收集的关联数据结构。 3. **...

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

    2. **软引用(Soft Reference)**: - 软引用是Java为了平衡性能和内存使用而引入的一种引用类型。通过`java.lang.ref.SoftReference`类实现。当系统内存紧张,即将抛出`OutOfMemoryError`时,JVM才会回收持有软...

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

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

    java 常见的四种引用

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

    Java引用类型1

    Java提供了四种不同级别的引用类型:强引用、软引用、弱引用和虚引用(幻象引用),每种引用类型在内存管理中有不同的作用。 1. **强引用(Strong Reference)** - 强引用是最常见的引用类型,即通常的变量赋值。...

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

    在Java中,`java.lang.ref`包提供了三种不同类型的引用:强引用(Strong Reference)、软引用(Soft Reference)和弱引用(Weak Reference)。我们主要关注弱引用,它通过`WeakReference`类来实现。弱引用对象在创建...

    浅谈Java引用和Threadlocal的那些事

    Java中有四种引用类型:强引用(Strong Reference)、软引用(Soft Reference)、弱引用(Weak Reference)和虚引用(Phantom Reference)。 1. 强引用(Strong Reference): 强引用是Java中最常见的引用类型,...

    java 引用相关文档

    在这里,我们将详细讲解Java中的四种引用类型:强引用、软引用、弱引用和虚引用,以及它们在内存管理和垃圾收集中的作用。 1. **强引用(Strong Reference)** - 强引用是Java中最常见的引用类型,它是默认的引用...

    java弱引用

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

    Android利用软引用和弱引用避免OOM的方法

    为了优化内存使用,Java引入了不同级别的引用类型,包括强引用、软引用、弱引用和虚引用。这些引用类型帮助开发者更好地控制对象的生命周期,并在必要时协助垃圾回收机制。 1. **强引用(Strong Reference)** - ...

    Java的四种引用

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

Global site tag (gtag.js) - Google Analytics