JVM 中四种引用类型

简介: JVM 中四种引用类型

JVM 中四种引用类型


强引用


  • 只要存在强引用,垃圾收集器永远不会回收 例如:Object obj = new Object();


  • 帮助垃圾对象回收 obj = null, ArrayList 源码实现


/**
 * Removes all of the elements from this list.  The list will
 * be empty after this call returns.
 */
public void clear() {
    modCount++;
    // clear to let GC do its work
    for (int i = 0; i < size; i++)
        elementData[i] = null;
    size = 0;
} 


软引用


  • 用来描述一些还有用但并非必须的对象。对于软应用关联着的对象,在系统将要发生内存泄漏溢出(Full GC )之前, 将会把这些对象列进回收范围之中进行二次回收,如果这次回收还没有足够的内存,就会抛出OOM(内存溢出)异常。


  • 在JDK1.2 之后提供了SoftReference类来实现软引用, 这个特征非常适合在:网页缓存、图片缓存等。


  • 浏览器网页缓存实例


//获取页面进行浏览
Browser prev = new Browser();
//浏览完毕后置为软引用
SoftReference sr = new SoftReference();
if (sr.get() == null) {
    prev = rs.get();
} else {
    prev = new Browser();
    sr = new SoftReference(prev); 
}


  • 软引用可以和一个引用队列(ReferenceQueue) 联合使用,如果软引用的对象被垃圾回收器回收,虚拟机会把这个软引用加入到与之关联的引用队列中。


弱引用


  • 它与软引用的区别在于:只具有弱引用的对象拥有更短暂的生命周期。在垃圾回收器线程扫描它所管辖的内存区域的过程中,一旦发现了只具有弱引用的对象,不管当前内存空间足够与否,都会回收它的内存。


  • JDK1.2之后,提供了WeakReference 类来实现弱引用


  • 示例:


import java.lang.ref.Reference;
import java.lang.ref.ReferenceQueue;
import java.lang.ref.WeakReference;
import java.util.LinkedList;
public class ReferenceTest {
    private static ReferenceQueue<VeryBig> rq = new ReferenceQueue<>();
    public static void checkQueue() {
        Reference<? extends VeryBig> ref = null;
        while ((ref = rq.poll()) != null) {
            if (ref != null) {
                System.out.println("In queue:" + ((VeryBigWeakReference) (ref)).id);
            }
        }
    }
    public static void main(String[] args) {
        int size = 3;
        LinkedList<WeakReference<VeryBig>> weakList = new LinkedList<>();
        for (int i = 0; i < size; i++) {
            weakList.add(new VeryBigWeakReference(new VeryBig("Weak " + i), rq));
            System.out.println("Just created weak: " + weakList.getLast());
        }
        System.gc();
        try {
            Thread.sleep(5000);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        checkQueue();
    }
}
class VeryBig {
    public String id;
    /**
     * 占用空间,让线程进行回收
     */
    byte[] b = new byte[2 * 1024];
    public VeryBig(String id) {
        this.id = id;
    }
    @Override
    protected void finalize() {
        System.out.println("Finalizing VeryBig " + id);
    }
}
class VeryBigWeakReference extends WeakReference<VeryBig> {
    public String id;
    public VeryBigWeakReference(VeryBig big, ReferenceQueue<VeryBig> rq) {
        super(big, rq);
        this.id = big.id;
    }
    @Override
    protected void finalize() {
        System.out.println("Finalizing VeryBigWeakReference " + id);
    }
}


  • 输出结果


Just created weak: cn.edu.cqvie.gc.VeryBigWeakReference@5451c3a8
Just created weak: cn.edu.cqvie.gc.VeryBigWeakReference@2626b418
Just created weak: cn.edu.cqvie.gc.VeryBigWeakReference@5a07e868
Finalizing VeryBig Weak 2
Finalizing VeryBig Weak 1
Finalizing VeryBig Weak 0
In queue:Weak 0
In queue:Weak 1
In queue:Weak 2


虚引用


  • 虚引用称为幽灵引用或幻影引用。它是最弱的引用关系,一个独享是否有虚引用的存在,完全不会对其生存时间构成影响,也无法通过虚引用来获取对象 实例。为一个对象设置虚应用关联的唯一目的就是能在这个对象被收集器回收时收到一个系统通知。在JDK1.2后,提供了PhantomReference 来实现虚引用。


四种引用的区别


四种引用的区别如下


引用类型 GC回收时间 用途 生存时间
强引用 never 对象的一般状态 JVM停止运行时
软引用 内存不足 对象缓存 内存足时终止
弱引用 GC时 对象缓存 GC后终止
虚引用 unknow unknow unknow



相关文章
|
存储 缓存 算法
JVM第三讲:深入理解java虚拟机之垃圾回收算法?CMS垃圾回收的基本流程?对象引用类型?
JVM第三讲:深入理解java虚拟机之垃圾回收算法?CMS垃圾回收的基本流程?对象引用类型?
249 0
|
8月前
|
Java
【JVM】深入理解Java引用类型:强引用、软引用、弱引用和虚引用
【JVM】深入理解Java引用类型:强引用、软引用、弱引用和虚引用
534 0
|
存储 缓存 算法
JVM 系列(5)吊打面试官:说一下 Java 的四种引用类型
JVM 系列(5)吊打面试官:说一下 Java 的四种引用类型
210 0
JVM 系列(5)吊打面试官:说一下 Java 的四种引用类型
|
Java Android开发
【Java 虚拟机原理】Java 引用类型 ( 强引用 | 软引用 | 弱引用 | 虚引用 | 静态变量 )
【Java 虚拟机原理】Java 引用类型 ( 强引用 | 软引用 | 弱引用 | 虚引用 | 静态变量 )
161 0
|
2月前
|
缓存 Prometheus 监控
Elasticsearch集群JVM调优设置合适的堆内存大小
Elasticsearch集群JVM调优设置合适的堆内存大小
363 1
|
3月前
|
存储 安全 Java
jvm 锁的 膨胀过程?锁内存怎么变化的
【10月更文挑战第3天】在Java虚拟机(JVM)中,`synchronized`关键字用于实现同步,确保多个线程在访问共享资源时的一致性和线程安全。JVM对`synchronized`进行了优化,以适应不同的竞争场景,这种优化主要体现在锁的膨胀过程,即从偏向锁到轻量级锁,再到重量级锁的转变。下面我们将详细介绍这一过程以及锁在内存中的变化。
48 4
|
11天前
|
存储 Java 程序员
【JVM】——JVM运行机制、类加载机制、内存划分
JVM运行机制,堆栈,程序计数器,元数据区,JVM加载机制,双亲委派模型
|
1月前
|
存储 监控 算法
深入探索Java虚拟机(JVM)的内存管理机制
本文旨在为读者提供对Java虚拟机(JVM)内存管理机制的深入理解。通过详细解析JVM的内存结构、垃圾回收算法以及性能优化策略,本文不仅揭示了Java程序高效运行背后的原理,还为开发者提供了优化应用程序性能的实用技巧。不同于常规摘要仅概述文章大意,本文摘要将简要介绍JVM内存管理的关键点,为读者提供一个清晰的学习路线图。
|
2月前
|
Java
JVM内存参数
-Xmx[]:堆空间最大内存 -Xms[]:堆空间最小内存,一般设置成跟堆空间最大内存一样的 -Xmn[]:新生代的最大内存 -xx[use 垃圾回收器名称]:指定垃圾回收器 -xss:设置单个线程栈大小 一般设堆空间为最大可用物理地址的百分之80