Android OOM以及GC的一些建议

Android OOM以及GC的一些建议

  1. 这里有一个不错的文章在分析内存泄漏。它绝对可以帮助你. http://android-developers.blogspot.com/2011/03/memory-analysis-for-android.html.
  2. 你是否能保证你的SoftHashMap正常工作?看起来相当复杂。建议使用debugger来确保SoftHashMap中从未超过15个位图。 MAT也可以帮助你确定有多少位图出现在内存中。可以调用 cache.put(photoToLoad.url,
    bmp),来禁用内存缓存,确定否是有问题.
  3. Activity leak   如果你只是在相同的activity中滑动发生OOM,这意味着有别的东西leaking 而不是activity 。如果停止/启动Activity几次,发现OOM仍然出现。那么查看MAT histogram 可以确定是否Activity leaking
  4. 当您使用图像的大小不是很确定时。应该要保证它的完美work,即使是 5m  px 这么大的图像。
  5. 你可以尝试只用 HashMap<String, SoftReference<Bitmap>>更换你的SoftReference的实现。这是良好的实现在内存缓存。它判断对象在内存中是否有足够的内存。如果内存太少,SoftReference释放的对象。
  6. 我推荐使用LinkedHashMap处理in-memory cache.。它有一个特殊的构造迭代在其中的最后一次访问顺序的entry。文档说,当你有超过15个项目在缓存中,你可以删除最近最少访问的项目。
  7. 如果你要加载更大的图像,你应该考虑清楚它们有多少内存消耗。如果太多,你可以只缓存他们SD卡,而不是内存中。这样做的话, 性能可能比较慢,但不会OOM
  8. 无关OOM。如果你调用clearCache() 在 onLowMemory()方法中。这样做不是一件好事,因为clearCache()也会删除SD缓存, 你要知道你要做的是清除内存缓存而不是SD缓存

分析heap,使用与jHat或Eclipse内存分析器(MAT)工具   

hprof-conv dump.hprof converted-dump.hprof

Resource here:

  1. Here‘s an amazing article on analyzing memory leaks. It can definitely help you. http://android-developers.blogspot.com/2011/03/memory-analysis-for-android.html.
  2. Are you absolutely sure your SoftHashMap implementation works fine? Looks rather complicated. You can use debugger to ensure SoftHashMap never holds more than 15 bitmaps. MAT can also help you to identify how many bitmaps are there in memory.

    You can also comment cache.put(photoToLoad.url, bmp) call. This way you‘ll disable in-memory caching to identify if it‘s a cause of a problem or not.

  3. Yes it may be an Activity leak. You can identify that. If you just scroll around in the same activity and get OOM it means that something else is leaking not activity. If you stop/start activity several times and get OOM it means activity is leaking. Also you
    can definitely say is activity leaking or not if you take a look at MAT histogram.
  4. As you use inSampleSize the image size doesn‘t matter. It should work fine even with 5mpx images.
  5. You could try to replace your SoftHashMap implementation with just HashMap<String, SoftReference<Bitmap>>. Read about SoftReference. It is good for very simple implementation of in-memory cache. It holds objects in memory if there‘s enough memory. If there‘s
    too little memory SoftReference releases objects.
  6. I can also recommend you to use LinkedHashMap for in-memory cache. It has a special constuctor to iterate items in the order in which its entries were last accessed. So when you have more than 15 items in cache you can remove least-recently accessed items.
    As documentation says:
  7. You know my implementation was designed with small images in mind, something like 50*50. If you have larger images you should think how much memory they consume. If they take too much you could just cache them to SD card but not to memory. The performance may
    be slower but OOM would not be a problem any more.
  8. Not related to OOM. I can see you call clearCache() in onLowMemory(). Not good because clearCache() also removes cache from SD. You should only clear in-memory cache not SD cache.
时间: 2024-10-10 01:03:56

Android OOM以及GC的一些建议的相关文章

Android OOM的解决方案

尽量不要使用setImageBitmap或setImageResource或BitmapFactory.decodeResource来设置一张大图, 因为这些函数在完成decode后,最终都是通过java层的createBitmap来完成的,需要消耗更多内存. 因此,改用先通过BitmapFactory.decodeStream方法,创建出一个bitmap,再将其设为ImageView的 source, decodeStream最大的秘密在于其直接调用JNI>>nativeDecodeAsse

Android OOM(Out of memory) 内存泄露基本知识

Android OOM(Out of memory) 内存泄露基本知识 转载至:http://blog.csdn.net/emilychai2010/article/details/12710135 1. 内存泄露 2. Android里的垃圾回收 3. Heap 4. 调试 5. 常见的内存泄露 1.什么是内存泄露(memory leak)? A "memory leak" in your code is when you keep a reference to an object

Android OOM问题终极解决方案

大家在安卓开发的过程中使用Bitmap,尤其是当程序中包含大量图片的时候或多或少会遇到OOM(Bitmap: Out Of Memory),遇到这个问题是非常痛苦的,在这里给大家分享一下我自己结合网络上寻找的各种方案,以及自己的研究总结出来的解决方案. 首先大家要知道OOM为什么会出现,通过上网查资料明白了是由于使用了 BitmapFactory.decodeFile(filePath) 这个方法导致的,这个方法通过Google提供的sdk看代码是将整个文件直接读取的所以占用资源比较大,所以找到

jvm学习笔记二(减少GC开销的建议)

一:触发主GC(Garbage Collector)的条件 JVM进行次GC的频率很高,但因为这种GC占用时间极短,所以对系统产生的影响不大.更值得关注的是主GC的触发条件,因为它对系统影响很明显.总的来说,有两个条件会触发主GC: 1)当应用程序空闲时,即没有应用线程在运行时,GC会被调用.因为GC在优先级最低的线程中进行,所以当应用忙时,GC线程就不会被调用,但以下条件除外. 2)Java堆内存不足时,GC会被调用.当应用线程在运行,并在运行过程中创建新对象,若这时内存空间不足,JVM就会强

关于android的apk版本升级的一些建议

关于android的apk版本升级的一些建议,有需要的朋友可以参考下. 额,闲着没事来一发 Android的版本号有versionCode,versionName两种. versionCode是主要升级的依靠参数,只能相同或大于的情况下才能升级,所以每版该值需要自增. versionName则主要作为显示标示,来说明该版是那个版本. 整合测试发布的apk和正式上线的apk,建议: 1.在上线时,versionCode采取一种方式自增,如1升至2,20升至21.但在测试时与上一版的versionC

给Android程序员的六个建议

给Android程序员的六个建议 分类: 安卓相关2015-07-14 23:58 177人阅读 评论(0) 收藏 举报 android程序员 如果你一年前写的代码 , 在现在看来你还感觉写的很不错 , 那么说明你学习的不够多. 不要在Context中持有静态引用 public class MainActivity extends LocationManagingActivity implements ActionBar.OnNavigationListener, GooglePlayServi

Android OOM异常解决方案

一,什么是OOM异常: OOM(out of Memory)即内存溢出异常,也就是说内存占有量超过了VM所分配的最大,导致应用程序异常终止: 二,为什么会产生OOM异常呢? OOM异常是Android中经常遇到的一个问题,程序员稍微不注意可能就导致其产生.通常OOM都发生在需要用到大量内存的情况下,因为Android的每一个应用都是一个Davlik虚拟机,该虚拟机的默认堆内存只有16M,远远无法跟我们的PC机比较,因此和容易导致OOM(Out Of Memory)异常的产生.导致这样的异常主要有

Android OOM 系列

2016-04-07 OOM手记 最近组里改友盟上的BUG,NullReference——防空,非UI线程访问UI控件?ClassCastException,Dialog在Activity之后dismis/show...各种问题慢慢解决了,因为大多就是业务逻辑的处理有问题.最后就剩下一个OOM的大头,因为大多数异常不是对应的具体的业务代码,都是系统类抛出的,所以统一放在最后解决:设计良好的app通常常驻内存的也就不过5个Activity,也少有Activity会占用很大的内存,因为历史代码的原因

Android OOM 解决方案

Out of Memory(内存溢出) 几乎是每个Android程序员都会遇到的事.在网上也能找到一大堆的解决方案,之前写过一篇<Android 内存溢出管理与测试>的博文.但感觉写得不是很好,今天整理一下打算重新写一篇. 首先什么是OOM?为什么会出现OOM? Out Of Memory,一般是由于程序编写者对内存使用不当,如对该释放的内存资源没有释放,导致其一直不能被再次使用而使计算机内存被耗尽的现象.重启计算机即可,但根本解决办法还是对代码进行优化.(摘自百度百科) 那么解决OOM的方法