Java WeakReference

简介: Java WeakReference

关于WeakReference的定义引用维基百科定义


在计算机程序设计中,弱引用与强引用相对,是指不能确保其引用的对象不会被垃圾回收器回收的引用。一个对象若只被弱引用所引用,则被认为是不可访问(或弱可访问)的,并因此可能在任何时刻被回收。一些配有垃圾回收机制的语言,如Java、C#、Python、Perl、Lisp等都在不同程度上支持弱引用。


1. WeakReference引用的对象什么时候被回收?



WeakReference所引用的对象,会在垃圾回收发生时被回收,但是是有前提条件的。我们知道垃圾回收分为minorGC 和 majorGC。如果发生若了minorGC,而弱引用指向的对象,只有弱引用,没有其他引用,而且对象在新生代中,才会被回收掉。如果发生了majorGc,如果对象只被弱引用引用,对象会被回收掉。

 WeakReference<String> weakReference = new WeakReference<String>(new String("Hello WeakReference"));
        System.out.println(weakReference.get());
        System.gc();
        try {
            TimeUnit.MILLISECONDS.sleep(100);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        System.out.println(weakReference.get());
输出结果如下
Hello WeakReference
[GC (System.gc())  883K->472K(9728K), 0.0008970 secs]
[Full GC (System.gc())  472K->381K(9728K), 0.0125556 secs]
null

如上证实了发生gc 只有WeakReference指向的对象会被回收掉


2.考虑这种情况呢
 WeakReference<String> weakReference = new WeakReference<String>("Hello WeakReference");
        System.out.println(weakReference.get());
        System.gc();
        try {
            TimeUnit.MILLISECONDS.sleep(100);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        System.out.println(weakReference.get());
输出结果如下
Hello WeakReference
[GC (System.gc())  887K->504K(9728K), 0.0124477 secs]
[Full GC (System.gc())  504K->381K(9728K), 0.0300315 secs]
Hello WeakReference

为什么这种情况下没有被回收掉呢?原因是”Hello WeakReference”是分配在常量池中,并不是分配在java堆中java gc并不会回收掉

相关文章
|
2月前
|
存储 缓存 Java
|
5月前
|
存储 缓存 Java
【Java】What's the difference between SoftReference and WeakReference in Java
【Java】What's the difference between SoftReference and WeakReference in Java
48 0
|
5月前
|
存储 缓存 Java
【Java】What's the difference between SoftReference and WeakReference in Java
【Java】What's the difference between SoftReference and WeakReference in Java
42 0
|
存储 缓存 Java
SAP ABAP和Java里的弱引用(WeakReference)和软引用(SoftReference)
SAP ABAP和Java里的弱引用(WeakReference)和软引用(SoftReference)
105 0
SAP ABAP和Java里的弱引用(WeakReference)和软引用(SoftReference)
|
缓存 Java 数据库连接
Java多线程编程-(18)-借ThreadLocal出现OOM内存溢出问题再谈弱引用WeakReference
引用类型分为:强引用( Strong Reference)、软引用( Soft Reference)、弱引用( Weak Reference)、虚引用( Phantom Reference)四种,这四种引用强度依次逐渐减弱。
1643 0
|
6天前
|
安全 Java 调度
Java编程时多线程操作单核服务器可以不加锁吗?
Java编程时多线程操作单核服务器可以不加锁吗?
21 2
|
10天前
|
存储 缓存 Java
java线程内存模型底层实现原理
java线程内存模型底层实现原理
java线程内存模型底层实现原理
|
15天前
|
缓存 Java 应用服务中间件
Java虚拟线程探究与性能解析
本文主要介绍了阿里云在Java-虚拟-线程任务中的新进展和技术细节。
|
12天前
|
Java 开发者
Java中的多线程基础与应用
【9月更文挑战第22天】在Java的世界中,多线程是一块基石,它支撑着现代并发编程的大厦。本文将深入浅出地介绍Java中多线程的基本概念、创建方法以及常见的应用场景,帮助读者理解并掌握这一核心技术。
下一篇
无影云桌面