众所周知,在写 android 程序的时候,很容易出现 OOM ,而出现的时机大多数是由 Bitmap decode 引发的:
ERROR/AndroidRuntime(16350): java.lang.OutOfMemoryError: bitmap size exceeds VM budget
我们知道,android程序内存一般限制在16M,当然也有24M的,而android程序内存被分为2部分:native和dalvik,dalvik就是我们平常说的java堆,我们创建的对象是在这里面分配的,而bitmap是直接在native上分配的,对于内存的限制是 native+dalvik 不能超过最大限制。
用以下命令可以查看程序的内存使用情况:
adb shell dumpsys meminfo $package_name or $pid //使用程序的包名或者进程id
用android自带的launcher程序为例:
run: adb shell dumpsys meminfo com.android.launcher
<BR>results:
Applications Memory Usage (kB):
Uptime: 113017 Realtime: 113017

** MEMINFO in pid 129 [com.android.launcher] **
native dalvik other total
size: 4572 3527 N/A 8099
allocated: 4113 2684 N/A 6797
free: 406 843 N/A 1249
(Pss): 1775 3572 3953 9300
(shared dirty): 1448 4020 4792 10260
(priv dirty): 1652 1308 708 3668
Objects
Views: 0 ViewRoots: 0
AppContexts: 0 Activities: 0
Assets: 5 AssetManagers: 5
Local Binders: 14 Proxy Binders: 21
Death Recipients: 0
OpenSSL Sockets: 0
SQL
heap: 64 memoryUsed: 64
pageCacheOverflo: 4 largestMemAlloc: 50
DATABASES
Pagesize Dbsize Lookaside Dbname
1024 4 48 launcher.db

具体每一项代表什么,参考:http://stackoverflow.com/questions/2298208/how-to-discover-memory-usage-of-my-application-in-android#2299813,我们比较关心的是这2行:
native dalvik other total
size: 4572 3527 N/A 8099
allocated: 4113 2684 N/A 6797

其中size是需要的内存,而allocated是分配了的内存,对应的2列分别是native和dalvik,当总数也就是total这一列超过单个程序内存的最大限制时,OOM就很有可能会出现了。

多数时候,发生OOM 都是在做一些跟图片相关的操作,以下提出一些建议尽量可以减少这种情况的发生:

1.decode bitmap 的时候,尽量配置下Options,例如:inSameSize
2.Bitmap使用完以后,调用 bitmap.recycle()来释放内存
3.如果应用是基于图片的应用,尽量采用LazyLoad和DymanicRecycle
4.decode bitmap 的时候,将decode代码 try catch 出来,catch oom error,避免程序crash,可以在catch里面做一些释放内存操作


更多相关文章

  1. Android(安卓)横屏显示
  2. android 查看其他进程内存数据
  3. Android(安卓)性能优化
  4. Android9.0 添加APP后台防杀机制
  5. Service简析
  6. Android的内存管理机制
  7. android独有的省内存的轻量级容器类
  8. Android(安卓)Bitmap内存限制
  9. Android(安卓)2.3 StatusBar 分析(二)

随机推荐

  1. Android设备支持USB转RJ45有线网卡( 沐阳
  2. Android(安卓)dialog回弹效果
  3. Android之SystemUI加载流程和NavigationB
  4. Android视图的截图
  5. android:shape的使用
  6. Android的onCreateOptionsMenu()创建菜单
  7. Android(安卓)开发技术周报 Issue#275
  8. Android牟利之道(一)--界面嵌入有米广告
  9. Android(安卓)Fragment 生命周期及回调方
  10. android 动画