首页
学习
活动
专区
工具
TVP
发布

你会使用软引用引用

戳这里,加关注哦~ 这篇文章我们来聊聊软引用引用对内存性能的帮助,大家在平时的开发过程中,对于内存性能做过哪些调优工作,其中的一个方法就是我们可以使用软引用引用。...引用(WeakReference): 垃圾回收器发现一个对象上只有引用,此时不管内存够不够,这个对象都会被回收。...System.out.println(weakRef.get()); } } 通过上面这个例子,我们来分析一下软引用引用的差别,首先看引用的例子,我们先定义了一个强引用对象...然后我们看第二个例子,首先定义了一个强引用对象,然后给这个对象加了一个引用,这里给对象加引用的方法是WeakReference,我们再通过abc = null,去掉这个对象的强引用,此时abc这个对象就只有一个引用...,通过System.gc()进行了一次垃圾回收,这个适合abc这个对象没有强引用,只有一个引用,根据引用的定义,在垃圾回收之后,这个对象会被回收的,所以说引用的输出结果是null。

99230
您找到你想要的搜索结果了吗?
是的
没有找到

引用引用的区别_强引用引用引用引用的区别

void main(String[] args) throws InterruptedException { User user = new User(1, "debo"); // 建立User对象的软引用...第二次由于分配了较大的内存,导致GC,这时候由于内存资源紧张,软引用被回收了,也就是虽然User对象有一个软引用引用着它,但User对象在此条件下也会被GC回收。...所以软引用的对象在一定条件下可被回收,故软引用对象不会导致内存溢出。...软引用到底有没有被回收,可以通过给软引用一个ReferenceQueue来跟踪,将上面的代码片段稍作修改,如下: import java.lang.ref.Reference; import java.lang.ref.ReferenceQueue...,所以ReferenceQueue为空,第二次GC回收了软引用对象,所以ReferenceQueue队列不为空,那为什么可以强转成UserSoftReference呢?

1.2K10

Python的引用

python的引用引用一个对象但不增加它的引用计数器。这么做的好处是什么呢?什么时候需要考虑用若引用呢?...(self):         self.effect = None  于是我们要删除一个效果,就得这样: char.effect.destroy() del char.effect  太麻烦了,不是?...我们来分析一下,之所以这么麻烦,就是因为ActivePloy对Effect有一个引用。那么如果ActivePloy不引用Effect不就OK了?这个时候,让我们来试试引用。...ActivePloy(object):      def __init__(self, effect):          self.effect = weakref.proxy(effect) # 引用... = weakref.proxy(effect, self.on_effect_destroy) # 引用effect         def active(self):           """激活时

88230

JNI:全局引用&局部引用&全局引用

从Java虚拟机创建的对象传到本地 C/C++ 代码时就会产生引用。根据Java的垃圾回收机制,只要有引用存在就不会触发该引用指向的Java对象的垃圾回收。...想一想既然局部引用能够在函数返回时自动释放,为什么还需要DeleteLocalRef函数呢? 实际上局部引用存在,就会防止其指向的对象被垃圾回收。...全局引用 全局引用可以跨越当前线程,在多个native函数中有效,不过需要编程人员手动来释放该引用。全局引用存在期间会防止在Java的垃圾回收的回收。...全局引用 全局应用是 JDK 1.2 新出来的功能,与全局引用相似,创建跟释放都需要由编程人员来进行操作。...,把NULL传入要比较的对象中,就能够判断全局引用所指向的Java对象是否被回收。

1.1K20

Golang中函数传参存在引用传递

int)(0xc420080008) fmt.Printf("addr: %#v\n", &p) // addr: (**int)(0xc420088028) } 定义了一个变量 a,并把地址保存在指针变量...由于 Go 里边并不存在引用传递,我们常常看到说 Go 中的引用传递也是针对:Slice、Map、Channel 这几种类型(这是个错误观点),因此为了解释清楚引用传递,先劳烦大家看一段 C++ 的代码...Go中没有引用传递 Go中函数调用只有值传递,但是类型引用引用类型,他们是:slice、map、channel。...大概意思是说:最开始用的是指针语法,由于种种原因改成了引用,但是这个引用与C++的引用是不同的,它是共享关联数据的结构。...如果go中存在引用传递,形参 s 的地址应该与实参 s1 一样(上面c++的证明),通过实际的情况我们发现它们具备完全不同的地址,也就是传参依然发生了拷贝——值传递。

2.2K20

Java引用类型:强引用,软引用引用,虚引用

在经过full gc后我们的软引用对象都放入了old区,由于full gc的存在,程序大多数强框下并不会OOM。由于软引用对象占据了老年代的空间,full gc将执行的更为频繁。...引用 引用时一种比软引用较弱的引用类型。...在系统GC时,只要发现引用,不管系统对空间是否足够,都会对对象进行回收。但是,由于垃圾回收器的线程通常优先级很低,因此,并不一定能很快地发现持有引用的对象。...在这种情况下,引用对象可以存在较长时间。...一旦一个引用对象被垃圾收集器回收,便会加入导一个注册引用队列中 虚引用引用时所有引用类型中最弱的一个,一个持有引用的对象,和没有引用几乎是一样的,随时都可能被垃圾回收器回收。

2.1K31

Java引用(WeakReferences)

前一段时间当我面试有些来应聘高级java开发工程师岗位的候选人时,在我问的众多问题中,有个问题是“你能告诉我引用是啥”,我不期望得到像论文中的细节一样的答案。...我很可能从有个20多年的老工程师口中得到“嗯……是不是和gc有关”这样的答案,所有哪些至少有5年以上经验的工程师只有两个人知道引用存在,只有其中一个知道引用的相关知识。...你很自然的想到去缓存那些图片,因为从硬盘加载成本太高了,并且你也希望避免在内存中存在两份图片副本的可能性。   ...我们上文已经讨论过强应用和引用,接下来我们看下软引用和虚引用。 软引用(Soft references)   软引用引用很想,除了它并没有引用那么急着想扔掉它引用的对象。...一个只被引用引用的对象会在下次gc的时候被处理掉,但被软引用引用的对象会存在一段时间。   软引用引用行为没啥不同,但在实际过程中,只要内存足够,软引用引用的对象会一直被保留。

55410

什么是强引用、软引用引用、虚引用

什么是强引用、软引用引用、虚引用? 强引用(StrongReference):一般指的是对像被new出来,强引用一般不会被jvm收回,但会报OutOfMemory(内存不足)。...Object obj = new Object(); 软引用(SoftReference):软引用相对来说于强引用,当内存足够的时候不会被GC回收,但内存不足时,再试图回收软引用,通过软引用可以做临时缓存...SoftReference ref = new SoftReference("hong"); 引用(WeakReference):区别于软件引用是生命周期更短,当GC回收启动发现引用不管内存满不满...(PhantomReference):这个引用也有人叫幻引用,也很明显,引用一个不存在,随时会被干掉,算是所有引用中最容易被干掉的。...4种引用强度从高到低:强引用 -> 软引用 -> 引用 -> 虚引用 最后 不管哪种引用,在开发过程中,都是尽量减少强引用,毕竟内存有限,虽然说放到内存可以提升用户访问效率,但是这也是一把双刃剑,

1.6K10

Java的强引用、软引用引用、虚引用

它底层实现和API接口上使用了强引用、软引用引用。所以温故知新下,也夯实下基础。...引用 引用是发生了一次垃圾回收后,既存的引用对象就开始回收。通常,一个引用对象仅能生存到下一次垃圾回收前。 用实验说明一下,为了防止JVM自动调整堆大小,我们把堆设置-Xmx200M。...一个像是从来没有存在过的幻影有什么用呢?Java的Unsafe类和NIO都可以直接访问堆外内存。堆外内存GC管不了,这时候虚引用就排上用场了。我们可以通过引用队列跟踪垃圾回收,做好善后。...当显示设置为软引用或者引用时,运行时GC触发和对象回收之间的关系和自己手动直接测试的结果是一样的,大家可以动手实践下。...总结 Java的强软弱虚引用被回收的时机不同:强引用引用被释放才会回收;软引用是没释放,但是快OOM了就会被回收;引用引用没释放,但是发生了GC后就会被回收;虚引用随时会回收,好像没有存在过,但是会有一个队列来跟踪它的垃圾回收情况

2K31

Python 引用 weakref

引用存在价值 在对象群组内部使用引用(即不会在引用计数中被计数的引用)有时能避免出现引用环,因此引用可用于解决循环引用的问题。...引用的创建 使用weakref模块,你可以创建到对象的引用,Python在对象的引用计数为0或只存在对象的引用时将回收这个对象。...如果没有回调或者引用引用不再存在,则此属性的值为 None。 返回对对象的引用。...指向同一对象的不同引用为同一对象,即同一个对象仅存在一个引用对象,重复创建的引用相互之间是强引用 引用使用时需要调用方法才可以解引用使用,因此无法为原始对象赋值,即: data = np.array...当对象被销毁,它的所有引用对象都得到通知,并被妥善处理。 实现 对同一对象的所有引用,被组织成一个双向链表,链表头保存在对象中。

99810

Java 的强引用引用、软引用、虚引用

Java四种引用包括强引用,软引用引用,虚引用。...强引用: 只要引用存在,垃圾回收器永远不会回收 Object obj = new Object(); //可直接通过obj取得对应的对象 如obj.equels(new Object()); 而这样...⑶引用(WeakReference) 引用与软引用的区别在于:只具有引用的对象拥有更短暂的生命周期。...引用可以和一个引用队列(ReferenceQueue)联合使用,如果引用引用的对象被垃圾回收,Java虚拟机就会把这个引用加入到与之关联的引用队列中。...2 如果使用软引用 SoftReference的特点是它的一个实例保存对一个Java对象的软引用,该软引用存在不妨碍垃圾收集线程对该Java对象的回收。

1.4K10

引用、软引用引用、虚引用的对比

引用、软引用引用、虚引用 从Jdk1.2开始,在java.lang.ref包下就提供了三个类:SoftReference(软引用),PhantomReference(虚引用)和WeakReference...(引用),它们分别代表了系统对对象的中的三种引用方式:软引用,虚引用以及引用。...SoftReference reference = new SoftReference(object); object = null; 引用:GC线程会直接清理引用对象,不管内存是否够用。...2 软引用引用的区别 引用不会影响GC的清理,也就是说当GC检测到一个对象存在引用也会直接标记为可清理对象,而软引用只有在内存告罄的时候才会被清理 3 引用和虚引用的区别 说两者的区别之前要说一下...虚引用必须和一个ReferenceQueue联合使用,当GC准备回收一个对象的时候,如果发现该对象还有一个虚引用,就会将这个虚引用加入到与之关联的队列 引用是当GC第一次试图回收该引用指向的对象时会执行该对象的

2K20

Java基础 之软引用引用、虚引用

引用与软引用的区别在于:只具有引用的对象拥有更短暂的生命周期。在垃圾回收器线程扫描它 所管辖的内存区域的过程中,一旦发现了只具有引用的对象,不管当前内存空间足够与否,都会回收它的内存。...引用可以和一个引用队列(ReferenceQueue)联合使用,如果引用引用的对象被垃圾回 收,Java虚拟机就会把这个引用加入到与之关联的引用队列中。    ...WeakHashMap能够节约存储空间,可用来缓存那些非必须存在的数据。     ...7.2 如果使用软引用     SoftReference的特点是它的一个实例保存对一个Java对象的软引用,该软引用存在不妨碍垃圾收集线程对该Java对象的回收。...如果用关联的引用队列创建引用,在引用对象成为 GC 候选对象时,这个引用对象就在引用清除后加入到引用队列中(具体参考上文软引用示例)。

89940

JNI--局部引用,全局引用全局引用

JNI中有三种引用 1.局部引用--定义方式多样:FindClass,NewObject,GetObjectClass,NewCharArray.......JNI中同一时间最多使用512个局部引用,所以我们有必要去手动释放 //局部引用 JNIEXPORT void JNICALL Java_com_aruba_jniapplication_JniDemo5...//使用局部引用 printf("%s",jstr); //释放局部引用 env->DeleteLocalRef(jstr); } 2.全局引用--可跨线程,跨方法使用 NewGlobalRef...是创建全局引用的唯一方法 创建全局引用 //创建全局引用 jstring global_str; JNIEXPORT void JNICALL Java_com_aruba_jniapplication_JniDemo5...image.png 3.全局引用--它不会阻止GC,可跨线程,跨方法使用 //创建全局引用 jstring global_weak_str; JNIEXPORT void JNICALL Java_com_aruba_jniapplication_JniDemo5

1.5K20

java学习引用类型之引用

在Java中,引用是一种比软引用更弱的引用类型。引用对象的生命周期更短暂,当垃圾回收器进行垃圾回收时,如果一个对象只被引用引用,那么该对象会被回收。...需要注意的是,由于引用对象的生命周期短暂,因此在程序中使用引用时要小心,确保适当地处理引用返回的null值,避免出现空指针异常。...与软引用不同,引用通常用于实现缓存、观察者模式等场景,其中对象的生命周期需要根据是否被其他强引用引用来确定。一旦对象不再被强引用引用引用就会失效并被垃圾回收器回收。...引用在Java中有以下几个主要的应用场景和用途:缓存:引用可以用于实现缓存。当我们需要缓存一些对象,但又不想让这些对象长时间占用内存时,可以使用引用引用这些对象。...引用和软引用是Java中两种不同的引用类型,它们之间有以下几个区别:生命周期:引用的生命周期更短暂。当垃圾回收器进行垃圾回收时,如果一个对象只被引用引用,那么该对象会被回收。

24330

【小家java】引用类型(强引用、软引用引用、虚引用

1、概述 本文不论述java中值传递和引用传递之间的问题(有需求的可移步理解java中值传递和引用传递),而重点讨论Java中提供了4个级别的引用:强应用、软引用引用和虚引用。...方法 } } 从上可以看出,咱们就可以监听回收,然后doSomething了 引用(WeakReference):引用和软引用很像,当gc时,无论内存是否充足,都会回收被引用关联的对象。...如果引用引用的对象被JVM回收,这个引用就会被加入到与之关联的引用队列中 虚引用(关注使用场景) 虚引用(PhantomReference):虚引用和前面的软引用引用不同,它并不影响对象的生命周期...鉴于软引用引用)的特点,可以结合ReferenceQueue来实现高速缓存了,这样对内存也特别友好。...从打印的结果中,我们看到有9995个对象被gc回收了,意味着在map的key中,除了weakReference之外,没有我们想要的业务对象(只存在引用对象,不存在真实对象了)。

2K40

【JVM】如何理解强引用、软引用引用、虚引用

如果不使用时,要通过如下方式来弱化引用,如下: o=null; // 帮助垃圾收集器回收此对象 显式地设置o为null,或超出对象的生命周期范围,则gc认为该对象不存在引用,这时就可以回收这个对象...举例: public void test(){ Object o=new Object(); // 省略其他操作 } 在一个方法的内部有一个强引用,这个引用存在栈中,而真正的引用内容(...Object)保存在堆中。...当这个方法运行完成后就会退出方法栈,则引用内容的引用存在,这个Object会被回收。 但是如果这个o是全局的变量时,就需要在不用这个对象时赋值为null,因为强引用不会被垃圾回收。...这样一来,当productA变为null时(表明它所引用的Product已经无需存在于内存中),这时指向这个Product对象的就是由引用对象weakProductA了,那么显然这时候相应的Product

1.1K10
领券