「java的软引用」java 软引用和弱引用的作用

博主:adminadmin 2023-03-20 01:20:07 307

今天给各位分享java的软引用的知识,其中也会对java 软引用和弱引用的作用进行解释,如果能碰巧解决你现在面临的问题,别忘了关注本站,现在开始吧!

本文目录一览:

软引用的回收策略

Java中有四种引用类型,强,软,弱,虚.本文主要讲解软引用的回收机制.需要读者对软引用有基本了解.

问题1容易理解,在保证系统能够正常运行的前提下,没必要全都回收. 举个例子, 堆内存100MB,软引用占了80MB,只剩20MB可用内存,触发了垃圾回收, 那么回收时没必要把80MB软引用都回收了,回收一部分,比如20MB,系统就有40MB可用内存,足以正常运行.

下面来详述问题2提到的软引用的回收策略

有两个关键属性

从这两个属性可得从上次gc起某个软引用未被访问的时间 idletime (可能为负值)

同时我们有软引用空闲保留时间(全局) idlelivetime

每MB空闲内存保留时间对应JVM参数 -XX:SoftRefLRUPolicyMSPerMB

当需要对软引用进行回收时,idletime大于 idlelivetime的软引用会被回收.

以上是软引用回收策略的大致描述,JVM还会有更精细的控制和优化,所以很难根据上面的公式进行精准演示,下面就以一种简化的方式演示软引用回收的LRU.

Java中的几种引用方式

Java中有几种不同的引用方式,它们分别是:强引用、软引用、弱引用和虚引用。下面,我们首先详细地了解下这几种引用方式的意义。 强引用在此之前我们介绍的内容中所使用的引用都是强引用,这是使用最普遍的引用。如果一个对象具有强引用,那就类似于必不可少的生活用品,垃圾回收器绝不会回收它。当内存空 间不足,Java虚拟机宁愿抛出OutOfMemoryError错误,使程序异常终止,也不会靠随意回收具有强引用的对象来解决内存不足问题。 软引用(SoftReference)SoftReference 类的一个典型用途就是用于内存敏感的高速缓存。SoftReference 的原理是:在保持对对象的引用时保证在 JVM 报告内存不足情况之前将清除所有的软引用。关键之处在于,垃圾收集器在运行时可能会(也可能不会)释放软可及对象。对象是否被释放取决于垃圾收集器的算法 以及垃圾收集器运行时可用的内存数量。 弱引用(WeakReference)WeakReference 类的一个典型用途就是规范化映射(canonicalized mapping)。另外,对于那些生存期相对较长而且重新创建的开销也不高的对象来说,弱引用也比较有用。关键之处在于,垃圾收集器运行时如果碰到了弱可及对象,将释放 WeakReference 引用的对象。然而,请注意,垃圾收集器可能要运行多次才能找到并释放弱可及对象。 虚引用(PhantomReference)PhantomReference 类只能用于跟踪对被引用对象即将进行的收集。同样,它还能用于执行 pre-mortem 清除操作。PhantomReference 必须与 ReferenceQueue 类一起使用。需要 ReferenceQueue 是因为它能够充当通知机制。当垃圾收集器确定了某个对象是虚可及对象时,PhantomReference 对象就被放在它的 ReferenceQueue 上。将 PhantomReference 对象放在 ReferenceQueue 上也就是一个通知,表明 PhantomReference 对象引用的对象已经结束,可供收集了。这使您能够刚好在对象占用的内存被回收之前采取行动。Reference与ReferenceQueue的配合使用。 GC、Reference与ReferenceQueue的交互 A、 GC无法删除存在强引用的对象的内存。 B、 GC发现一个只有软引用的对象内存,那么:① SoftReference对象的referent 域被设置为null,从而使该对象不再引用heap对象。② SoftReference引用过的heap对象被声明为finalizable。③ 当heap 对象的 finalize() 方法被运行而且该对象占用的内存被释放,SoftReference 对象就被添加到它的 ReferenceQueue(如果后者存在的话)。 C、 GC发现一个只有弱引用的对象内存,那么:① WeakReference对象的referent域被设置为null,从而使该对象不再引用heap对象。② WeakReference引用过的heap对象被声明为finalizable。③ 当heap对象的finalize()方法被运行而且该对象占用的内存被释放时,WeakReference对象就被添加到它的ReferenceQueue(如果后者存在的话)。 D、 GC发现一个只有虚引用的对象内存,那么:① PhantomReference引用过的heap对象被声明为finalizable。② PhantomReference在堆对象被释放之前就被添加到它的ReferenceQueue。 值得注意的地方有以下几点:1、GC在一般情况下不会发现软引用的内存对象,只有在内存明显不足的时候才会发现并释放软引用对象的内存。 2、GC对弱引用的发现和释放也不是立即的,有时需要重复几次GC,才会发现并释放弱引用的内存对象。 3、软引用和弱引用在添加到ReferenceQueue的时候,其指向真实内存的引用已经被置为空了,相关的内存也已经被释放掉了。而虚引用在添加到ReferenceQueue的时候,内存还没有释放,仍然可以对其进行访问。

2、GC-引用类型

1、引用类型

    为了让程序更好的控制java对象生命周期,让JVM更好的进行垃圾回收,java中提供了5种由强到弱的方式来引用对象:

强引用

    强引用是程序中使用最多的一种引用,我们直接new出来的对象都是用强引用引用的。如String str=new String("abc");只要对象被强引用使用着,就不会被垃圾回收器回收,申请不到内存时会抛出OutOfMemoryError。

软引用(SoftReference)

    软引用用来引用那些可用可无的对象,需要配合引用队列(ReferenceQueue)一起使用,当内存不足时,会被JVM垃圾回收,同时把软引用本身对象放入引用队列中,等待回收。

弱引用(WeakReference)

    弱引用也是用来引用那些可用可无的对象,但引用强度比软引用更低,当垃圾收集线程扫描到弱引用时,不管内存足不足,都会回收其占用的空间,并把弱引用放入关联的引用队列(ReferenceQueue)中,等待回收。

幽灵引用(PhantomReference)

    幽灵引用,又称虚引用。其实被此引用引用的对象对对象的生命周期没任何作用,他存在的主要作用是追踪一些对象的活动信息。必须和QueueReference一起使用。在创建ByteBuffer对象时,会创建一个Cleaner虚引用对象,当无强引用引用时,会进入引用队列,由一个专门的线程进行扫描,然后调用直接内存的方法来进行回收内存空间。

终结器引用(PhantomReference)

    Object中的个finalize方法,所有类的根类都是Object,如果对象重写了finalize方法,那么在运行的时候就会生成一个终结器引用来引用对象,如果对象没有被强引用关联,并且JVM虚拟机还未调用finalize方法,那么执行垃圾回收时,JVM会把终结器引用加入引用队列,由线程优先级很低的Finalizer线程去扫描队列,发现有终结器引用,并进行finalize调用,调用完后,将不定时对此对象进行回收。

关于java的软引用和java 软引用和弱引用的作用的介绍到此就结束了,不知道你从中找到你需要的信息了吗 ?如果你还想了解更多这方面的信息,记得收藏关注本站。