码迷,mamicode.com
首页 > 编程语言 > 详细

Java中的StrongReference、 WeakReference、SoftReference

时间:2016-06-12 13:47:33      阅读:307      评论:0      收藏:0      [点我收藏+]

标签:

 

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

 

Java中的StrongReference、 WeakReference、SoftReference

标签:

原文地址:http://www.cnblogs.com/hi0xcc/p/5576707.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!