Java中的StrongReference、 WeakReference、SoftReference

无论是python还是java,只要是vm,都会有StrongReference和WeakReference这两个概念,在不同的VM平台上,可能还会产生一些另外的 __Reference概念,比如JVM的 SoftReference 、PhantomReference

三点念念碎:

1.VM管理内存大概都会有一个引用计数。

2.GC回收内存大概都会从某些ROOT object开始遍历,托管内存中如果一些 对象不能被 遍历到,那么这些对象就是垃圾,就应该被回收。

3.有一些额外的内存使用场景,是不适合用GC来处理的,比如各种cache,所谓cache就是一堆数据,可能在某个时间点会用到,也可能永远不会用到,所以它们应该在某段时间内有效,过期就扔掉。如果使用GC来处理,把这些数据放入到一个数据集合对象中(比如LinkedList),那只要这个linkedlist有被引用到,linkedlist中的数据是永远不会被回收的。

StrongReference和WeakReference

1.StrongReference就是普通的对象引用,比如 Object obj=new Object();这个obj 就是StrongReference,这种对象在VM中属于常规对象,非常普通。

2.SoftReference 是一种比较强的引用,JVM中的内存管理比较复杂,将引用分为不同的类型,在内存使用量不同的状况,用不同的策略,SoftReference 这种 reference一般情况是不会回收被引用对象的,但是在内存不足(使用了多少内存算是内存不足?这个值可以配置?),要引发OOM异常的时候,会回收这个被对象。用SoftReference做cache回比较好,数据会尽量的放在内存中,知道到达了某个阈值,才开始清理SoftReference数据。

3.WeakReference 对象,就是通过某个对象可以获取到被引用的对象,但是这个被对象的生命周期不受这个引用的控制,也就是这个引用不会引起引用计数的增加,也不会引起GC 遍历时候的遍历到达这个被引用,所以被引用对象可以随时被GC回收走。

时间: 2024-11-08 21:28:29

Java中的StrongReference、 WeakReference、SoftReference的相关文章

Java中PhantomReference、WeakReference、SoftReference有什么区别?

Java中有多种引用类型,按照从强到弱的顺序分别如下: 强引用:就是最常见的引用,通过等号赋值就是强引用. 软引用:当内存不足时自动释放引用.一般应用于需要大量内存的缓存程序中. 弱引用:不阻止垃圾回收,当强引用或者软引用都消失时,即使存在弱引用内存也会被释放. 幽灵引用:只引用一个对象的"灵魂",幽灵引用是不能直接访问的,所以get方法永远返回null.这种引用能阻止JVM释放对象的内存,但是被引用的对象可以finalize.这东西有什么用呢?按照文档中的说法就是用于调整对象之间fi

Java引用总结--StrongReference、SoftReference、WeakReference、PhantomReference

http://www.cnblogs.com/skywang12345/p/3154474.html 1 Java引用介绍 Java从1.2版本开始引入了4种引用,这4种引用的级别由高到低依次为:    强引用  >  软引用  >  弱引用  >  虚引用 ⑴强引用(StrongReference)    强引用是使用最普遍的引用.如果一个对象具有强引用,那垃圾回收器绝不会回收它.当内存空间不足,Java虚拟机宁愿抛出OutOfMemoryError错误,使程序异常终止,也不会靠随意回

java中虚引用PhantomReference与弱引用WeakReference(软引用SoftReference)的差别

之前的这篇博客介绍了java中4种引用的差别和使用场景,在最后的总结中提到: "软引用和弱引用差别不大,JVM都是先把SoftReference和WeakReference中的referent字段值设置成null,之后加入到引用队列:而虚引用则不同,如果某个堆中的对象,只有虚引用,那么JVM会将PhantomReference加入到引用队列中,JVM不会自动将referent字段值设置成null".这段总结写的比较仓促,也没有给出实际的例子加以佐证.本文主要是重申下这几种引用的差别,并

Java中的 WeakReference 和 SoftReference

我们知道Java语言中没有指针,取而代之的是引用reference.Java中的引用又可以分为四种:强引用,弱引用(WeakReference),软引用(SoftReference),虚引用(PhantomReference).其中强引用,就是我们平时使用的最多的最普通的引用,虚引用一般我们是没有机会使用到的.所以我们主要了解下 WeakReference 和 SoftReference. 1. 先上一段代码: public class ReferenceTest { public static

Java中关于WeakReference和WeakHashMap的理解

新美大的10月11日的笔试中有一道选择题,让选择函数返回结果,代码如下: 1 private static String test(){ 2 String a = new String("a"); 3 WeakReference<String> b = new WeakReference<String>(a); 4 WeakHashMap<String, Integer> weakMap = new WeakHashMap<String, In

谈谈java中的WeakReference

java语言中为对象的引用分为了四个级别,分别为 强引用 .软引用.弱引用.虚引用. 本文只针对java中的弱引用进行一些分析,如有出入还请多指正. 在分析弱引用之前,先阐述一个概念:什么是对象可到达和对象不可到达状态. 其实很简单,我举个例子: 现在有如下两个类class A class B,在JVM上生成他们两个类的实例分别为 instance a  instance b 有如下表达式: A a = new A(); B b = new B(); 两个强引用对象就生成了,好吧,那么这个时候我

java中四种引用类型(对象的强、软、弱和虚引用)

对象的强.软.弱和虚引用 在JDK 1.2以前的版本中,若一个对象不被任何变量引用,那么程序就无法再使用这个对象.也就是说,只有对象处于可触及(reachable)状态,程序才能使用它.从JDK 1.2版本开始,把对象的引用分为4种级别,从而使程序能更加灵活地控制对象的生命周期.这4种级别由高到低依次为:强引用.软引用.弱引用和虚引用. ⑴强引用(StrongReference) 强引用是使用最普遍的引用.如果一个对象具有强引用,那垃圾回收器绝不会回收它.当内存空间不足,Java虚拟机宁愿抛出O

java中存在的四种引用

Java开发中存在四种引用,它们分别是: 强引用(StrongReference) 强引用是使用最普遍的引用.如果一个对象具有强引用, 那垃圾回收器绝不会回收它.当内存空间不足,Java虚拟机宁愿抛出OutOfMemoryError错误,使程序异常终止,也不会靠随意回收具有强引用的对象来解决内存不足的问题. 软引用(SoftReference)如果一个对象只具有软引用,则内存空间足够, 垃圾回收器就不会回收它:如果内存空间不足了,就会回收这些对象的内存. 只要垃圾回收器没有回收它,该对象就可以被

JAVA中的四种引用以及ReferenceQueue和WeakHashMap的使用示例

简介: 本文主要介绍JAVA中的四种引用: StrongReference(强引用).SoftReferenc(软引用).WeakReferenc(弱引用).PhantomReference(虚引用)的作用.同时我们还将介绍ReferenceQueue和WeakHashMap的功能和使用示例. 欢迎探讨,如有错误敬请指正 如需转载,请注明出处 http://www.cnblogs.com/nullzx/ 1. JAVA中的四种引用 四种引用中,软引用.若引用.虚引用都需要相关类来创建.创建的时候