很多人说到:java存在内存泄漏
我不想反驳,因为我也开始慢慢说了,但我知道:内存泄漏,和,规范编码,是两个完全不同的概念
所以,我想说:请规范编码
java的“内存泄漏”:
堆内存不够用了
为什么不够用了?因为你认为已经过时的东西,没有被系统释放掉内存
为什么没有释放掉内存?
因为你没有显示释放(c++版本)
因为你还拥有着该对象的引用,而该对象没有被认为是垃圾(java版本)
所以,你的编码并不规范
*********************************************************
WeakReference和内存泄漏有什么样的关系?
好像,没关系
那么WeakReference又是什么?
让我们先描述一个问题:
我有一个对象a(它非常的消耗内存,比如一个bitmap),当你同时申请了20个对象在android中,你将会看到out of memory异常
但是,如果你不缓存图片,那么用户将会认为你的app的性能非常差:
当你的应用涉及到gridview,而每一个item都是一个图片时
一个矛盾:不加载图片(性能低下) vs 加载图片(加载多了,程序会挂)
一个解决:
只加载有限的图片,如5个图片
是的,这能解决问题
但是,你要为此付出的是什么:手动编写加载策略,以及,释放策略
WeakReference是什么:
先不看官方doc,让我们举个例子:
对象a非常的消耗内存,我有一个WeakReference对象(wra),并且和对象a关联:(wra & a are good friends)
那么,在虚拟机看来是什么样子呢:wra对象不是个垃圾,但是和wra对象相关联的对象(对象a)被认为是垃圾
是的,垃圾就是垃圾,但是:垃圾并不会立刻被清理
也就意味着:你仍然可以使用对象a,如果它还没被清理的情况下
如果对象a已经被清理呢:你必须重新构建对象a,再一次,和wra关联
那样做有什么样的好处:
你将可以肆无忌惮的申请任意多个“非常消耗内存”的对象(前提是,让他们和WeakReference关联)
使用这些对象前,先判定他们有没有被清理
如果是,重新构建该对象(可能重新构建并不繁琐)
如果不是,直接使用
总结:WeakReference负责了:释放策略
与WeakReference类似的还有:SoftReference,大同小异
*********************************************************
事实,并不是,看上去很美
我曾经做过实验,按照WeakReference的做法,编写程序,在android2.2上,程序运行正常
但是,同一套代码运行在android4.0上,程序崩溃:out of memory
正是为了避免OOM异常,我采用了WeakReference
但是,,,,,
WeakReference,不靠谱
在2.2 vs 4.0上
- 浏览: 31150 次
- 来自: 南京
最新评论
-
jspjson:
把ffmpeg.c编译进去,请教怎么做呢,
linux虚拟机下面编译ffmpeg,并调用其main方法 -
chiyou7:
您好~ 最近在开发一个变声软件 遇到点问题,可以请教一下你吗 ...
如何像talking tom那样,自动监听到外部声音,和,简单的变声_3 -
包su:
diffo 写道再好用的博客系统也不如自己建一个放心啊,来用我 ...
welcome -
diffo:
再好用的博客系统也不如自己建一个放心啊,来用我大GitHub吧 ...
welcome
相关推荐
SoftReference、WeakReference和PhantomRefrence分析和比较
这个项目为万能的(有时是可怕的)弱引用实现了一个kotlin包装器,以便您可以更友好地使用它们。
AsyncTask_WeakReference
我们平常用的都是对象的强引用,如果有强引用存在,GC是不会回收对象的。我们能不能同时保持对对象的引用,而又可以让GC需要的时候回收这个对象呢?... WeakReference wref = new WeakReference( obj ); obj
StrongReference,SoftReference, WeakReference的使用实例,请参照博客:http://blog.csdn.net/To_be_Designer/article/details/72673421
主要介绍了Java弱引用(WeakReference)的理解与使用,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
创建用于WPF MVVM绑定的Singleton,并对绑定的属性使用弱引用的概念。
3.1 强引 3.2 软引 3.3 弱引 3. 4 假象引
这是对 java.lang.ref.WeakReference 实现的修改,它将通过 JMX MBean 跟踪和报告它发现的内容。如何使用: 在您的应用程序中启用 JMX。 然后使用指向此实现的引导类路径启动 Java 应用程序。 例如: $ java -...
弱参考测试 代码测试 ...或在命令行上创建一个新的存储库 touch README.md git init git add README.md git commit -m "first commit" git remote add origin git push -u origin master ......git remote add origin ...
import java.lang.ref.WeakReference; import android.app.Activity; import android.content.ContentResolver; import android.content.ContentValues; import android.database.Cursor; import android.net.Uri; ...
Android ListView 异步加载图片,一点也不卡,使用AsyncTask和WeakReference,注释详尽
弱引用(WeakReference) 23 虚引用(PhantomReference) 24 【基础】final, finally, finalize的区别 24 【基础】Java 中定义常量的几种方法 25 【基础】什么时候使用字节流?什么时候用字符流? 26 【基础】GBK与...
RFC的作者Nikita Popov强调了为什么用户区WeakMap理想:弱映射需要一流的语言支持,并且无法使用PHP提供的现有功能来实现。乍一看,从spl_object_id()到任意值的数组映射似乎可以达到弱映射的目的。由于多种原因...
1.强引用1.强引用 2.软引用(SoftReference) 3.弱引用(WeakReference) 4.虚引用(PhantomReference) 等等;
SimpleLeakCanaryLeakCanary simple version抽取了LeakCanary检测部分的代码,放在了这里,有兴趣的可以看下原理简单点说就是: 在onDestroy的时候为Activity加上WeakReference,然后在合适的时机调用Runtime....
VSoft.WeakReference 该单元背后的思想是提供与Delphi中引用计数对象类似的生命周期,就像WeakReference在.NET中一样。 当涉及循环引用时,delphi中引用计数的对象有一些限制,例如TParent引用它的子对象(通过...
周期无法控制可以采用SoftReference,WeakReference,PhantomReference这三种对象来执行(看了Ibatis的缓存机制才发现JDK居然还提供了PhantomReference这玩意儿,得恶补基础啊),这三种都是弱引用,区别在于强度...