`
yznxing
  • 浏览: 367288 次
  • 性别: 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
分享到:
评论

相关推荐

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

    学习理解函数加上weak后的变化

    理解Java中的弱引用(Weak Reference)

    本篇文章尝试从What、Why、How这三个角度来探索Java中的弱引用,理解Java中弱引用的定义、基本使用场景和使用方法。由于个人水平有限,叙述中难免存在不准确或是不清晰的地方,希望大家可以指出,谢谢大家:)  1....

    弱关系的力量The strength of weak ties

    研究发现:其实与一个人的工作和事业关系最密切的社会关系并不是“强关系”,而常常是“弱关系”。“弱关系”虽然不如“强关系”那样坚固(金字塔),却有着极快的、可能具有低成本和高效能的传播效率。

    VSoft.WeakReferences:德尔福的弱引用

    VSoft.WeakReference 该单元背后的思想是提供与Delphi中引用计数对象类似的生命周期...可以弱引用的类需要从TWeakReferencedObject 。 type TParent = class(TWeakReferencedObject, IParent) ... end; TChild =

    ARM 之十一__weak 代码 WEAK.7z

    博文 ARM 之十一__weak 和 __attribute__((weak)) 关键字的使用 的测试代码,备用!

    弱lru高速缓存:使用LRU和弱引用以与垃圾回收协调工作的方式缓存数据的缓存

    它使用LRU / LFU(LRFU)到期来保留引用的数据,然后,一旦数据处于非活动状态,它将使用弱引用(和终结注册表)来允许GC作为正常GC周期的一部分删除缓存的数据,但仍然继续只要数据仍驻留在内存中并且尚未被收集,...

    weak-ptr 和 shared-ptr 源码

    关于C++智能指针 weak_ptr (弱引用 智能指针) 和 shared_ptr (强引用 智能指针)的源文件。 资源分不能设为0了。。

    Weak-Password.zip

    压缩包包含了常见的弱口令用户名,弱口令密码。包含常见的服务ftp、telnet、mysql等。还有sql注入测试代码。

    weak galerkin finite element meathods on polytopal

    weak galerkin finite element meathods on polytopal

    iOS 中weak的实现代码示例

    weak 属性关键字就是弱引用,它不会增加引用计数但却能保证指针的安全访问,在对象释放后置为 nil,从而避免错误的内存访问。主要为了解决循环引用的问题。 接下来,我们会从 objc 库中的 NSObject.mm、 objc-weak....

    国外windows 弱口令检测工具

    国外windows 弱口令检测工具,xTSCrack is a simple RDP Audit tool for Penentration Tester find weak passwords over RDP protocol. xTSCrack support Windows 2000, XP, 2003 and 2008 Terminal Service.

    weak操作入门(数据挖掘)

    让你轻松掌握weka操作方法,以便进行数据挖掘,这是简单介绍怎么使用这个软件的一个文档

    The strength of weak learnability.pdf

    The strength of weak learnability.pdf

    WeakPassScan弱口令批量扫描脚本

    可以实现批量扫描ssh、mysql端口弱口令。使用方法: python3 WeakPassScan.py 124行开始,设置一下ip文件位置、用户名位置、密码位置 ippath = r'newOrder57.txt' userpath = r'user_ssh.txt' passpath = r'pass...

    GObject Reference Manual

    Weak References Reference counts and cycles Object properties Accessing multiple properties at once The GObject messaging system Closures C Closures non-C closures (for the fearless). Signals ...

    weak对象储存原理?销毁的时候为什么会置nil(下)

    1.通过SideTable找到我们的weak_table; 2.weak_table根据referent找到或者创建...3.然后append_ referent(entry, referent)将我的新弱引用的对象加进去entry; 最后weak_ entry_insert把entry加入到我们的weak_table.

    weak对象储存原理?销毁的时候为什么会置nil(上)

    1.通过SideTable找到我们的weak_table; 2.weak_table根据referent找到或者创建...3.然后append_ referent(entry, referent)将我的新弱引用的对象加进去entry; 最后weak_ entry_insert把entry加入到我们的weak_table.

    Practical Weak Supervision.pdf

    在这本书中,Wee Hyong Tok, Amit Bahree和Senja Filipi向您展示了如何使用弱监督学习模型创建产品。 您将学习如何使用来自Snorkel的弱标记数据集构建自然语言处理和计算机视觉项目,Snorkel是斯坦福人工智能实验室...

    weak,Strong指针小结

    只要没有强指针指向对象,就会释放对象,弱指针不会这样,及时有弱指针指向对象,对象没有强指针指向,也会自动释放掉。一般,无需显式声明为强指针,但是在封装里,定义方法的时候需要写明。而弱指针,必须显式说明...

    Android代码-android-weak-handler

    Android Weak Handler Memory safer implementation of android.os.Handler Problem Original implementation of Handler always keeps hard reference to handler in queue of execution. Any object in Message or...

Global site tag (gtag.js) - Google Analytics