无论是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回收走。