一、查看当前手机的在单进程中所分配的内存
StringBuilder builder = new StringBuilder();
ActivityManager manager = (ActivityManager) getSystemService(ACTIVITY_SERVICE);
int memory = manager.getMemoryClass();
int largeMemory = manager.getLargeMemoryClass();
builder.append("分配内存为:"+memory+"\n");
builder.append("最大分配内存:"+largeMemory);
mTextMessage.setText(builder.toString());
Log.d("main","分配内存为:"+memory+"\n"+"最大分配内存:"+largeMemory);
二、内存的管理方式
1、Android系统内存分配与回收方式
一个App通常就是一个进程对应一个虚拟机
GC只在Heap剩余空间不够时才发出垃圾回收信号
Gc触发时,所有的线程都会出现暂停,出现内存抖动
2、App内存限制
每个App分配的最大内存限制,随不同设备而不同
占用内存的大户:图片
3、切换应用时后台App清理机制
App切换时的LRU Cache:LRU算法最近使用的排在最前面,最少的可能被清理掉。
随着内存的减少系统会通过OnTrimMemory方法通知App,进而进行相应的处理。
4、监控内存的集中方法演示:
代码方式:
//空闲内存
long freeMemory = Runtime.getRuntime().freeMemory();
//总内存
long totalMemory = Runtime.getRuntime().totalMemory();
//最大内存
long maxMemory = Runtime.getRuntime().maxMemory();
通过Android Studio自带的工具
三、内存优化方法
a)数据结构优化
频繁字符串拼接用StringBuilder
ArrayMap、SparseArray替换HashMap
内存抖动:频繁的生成对象,
再小的Class也要耗费0.5K
HashMap一个entry需要额外占用的32B
b)对象的复用
复用系统自带的资源
ListView的优化
避免在onDraw方法里面执行对象的创建
c)避免内存泄漏
由于代码瑕疵,导致这块内存虽然停止不用了,但依然被其他东西引用着,使得GC没法对它回收。
内存泄漏会导致剩余的可用heap越来越少,导致GC频繁。
用Application Context而不是Activity Context;
注意Bitmap ,Cursor,Io等对象是否及时回收或关闭
四、OOM问题优化
a)OOM问题分析
Oom的必然性与可解决性(内存的分配限制)
OOM的大部分发生在图片处理的地方
b)强引用、软引用的意义
在当前的活动界面中强引用对象的内存不会发生变化,而软引用会由于内存的变小,有被回收的可能。
强引用与软引用的使用场景:bitmap
c)优化OOM问题方法
注意临时Bitmap对象的及时回收
避免Bitmap的浪费
Try catch某些大内存分配的操作
加载Bitmap:缩放比例、解码格式、局部加载。