原创

安卓-注意--内存优化(优化内存 可用内存 OOM内存溢出 Bitmap LRU缓存算法)

1、Androidmainfest.xml 文件配置
<application
android:allowBackup="true"
android:label="MemOpti"
android:largeHeap="true"
android:supportsRt1="true"

2、获取内存配置
ActivityManager activityManager = getSystemService(Context.Activity_SERVICE);
int memClass = activityManager.getMemoryClass();//以MB为单位
int largeMemClass = activityManager.getLargeMemoryClass();//以MB为单位

进程可从操作系统获取的最大内存、已获取到内存、已获取到内存的空闲部分
Float maxMemory= Runtime.getRuntime().maxMemory() *1.0f / (1024*1024);
Float totalMemory = Runtime.getRuntime().totalMemory() *1.0f / (1024*1024);
Float freeMemory = Runtime.getRuntime().freeMemory() *1.0f / (1024*1024);

memClass = 384
largeMemClass = 384
maxMemory= 384.0
totalMemory = 11.014893
freeMemory = 3.630684

3、切换应用时后台APP清理机制
APP切换是的LRU Cache
@Override
public void onTrimMemory(int level)回调方法
{
//具体介绍http://blog.csdn.net/linghu_java/article/details/17348539
}

4、shell脚步命令
adb shell
ps //查看系统进程
dumpsys meminfo 包名 //查看某个包的内存使用情况

5、查看程序运行时的Memory、CPU、Network
Android Studio 打开Android Monitor
Eclipse DDMS->Update Heap

6、


7、APP内存优化方法
数据结构优化
对象复用
避免内存泄漏
频繁字符串拼接用StringBuilder
ArrayMap、SparseArray替换HashMap
内存抖动(频繁的申请、释放内存)

数据结构优化
再小的Class耗费0.5KB
HashMap一个entry需要额外占用的32B
//entry 相当于Entry<K,V>
对象复用
复用系统自带的资源
ListView/GridView的ConvertView复用
避免在onDraw方法中执行对象的创建
避免内存泄漏
内存泄漏会导致剩余可用的Heap越来越少,频繁触发GC(垃圾回收)
尤其Activity泄漏
用Application Context而不是Activity Context
注意Cursor对象是否及时关闭(个人补充说明:数据库普通模式下使用完也应该关闭,但是
在单例模式下不要关闭数据库对象)
8、OOM问题优化
OOM问题分析
强引用、乱引用的意义
优化OOM问题的方法
注意临时Bitmap对象的及时回收
避免Bitmap浪费
Try catch某些大内存分配的操作
加载Btimap:缩放比例(动态计算并抽样已封装)、解码格式、局部加载(地图应用)
(bitmap的字节码长度会远大于图片本身字节码长度,而且bitmap属于native
申请的内存创建的对象,使用bitmap.recycle或者bitmap=null,好像不能真正
释放内存,加载下一站图片时native会使用新的内存块处理,好像一般一共
就十几兆,所以直接加载大图很容易造成OOM)
(bitmap的编码使用RGB_565 可以一定程度的减小bitmap字节码长度)
(图片加载使用LRU缓存算法,另外还有 LFU FIFO缓存算法)
FIFO:First In First Out,先进先出
LRU:Least Recently Used,最近最少使用
LFU:Least Frequently Used,最不经常使用
以上三者都是缓存过期策略。

软引用:private SoftReference<String> softref;//在当前页未关闭时可能会被系统
回收,强引用则不会被回收。

来源:慕课网-《APP性能优化之内存优化》

正文到此结束
本文目录