一、查询应用运行的内存限制

代码如下:

ActivityManager activityManager = (ActivityManager) getSystemService(Context.ACTIVITY_SERVICE);
/**
  * 手机上app运行时的内存限制
  */
int memClass = activityManager.getMemoryClass(); // 以m为单位
/**
 * AndroidManifest.xml中application中有个largeHeap属性可配置去获取更
 * 大内存,但一般不会设置,而且大多数手机中也不起作用           
 */
int LargememClass = activityManager.getLargeMemoryClass(); // 以m为单位

二、Android系统内存分配与回收方式

1.一个APP通常就是一个进程对应一个虚拟机(可能存在多进程的情况)
运行app后,通过adb命令可以进入模拟器的linux环境进行查看内存分配
adb shell // 进入安卓底层linux系统命令
ps // 查看系统里面进程的命令

通过app包名找到所在进程,可以查看一些基础的内存信息,并可进一步详细查询
dumpsys meminfo 包名

2.GC只在Heap剩余空间不够时才会发出垃圾回收
3.GC触发时,所有的线程都是会被暂停

三、APP内存限制机制

1.每个APP分配的最大内存限制,随不同设备而不同
2.吃内存大户:图片
3.通过内存限制,防止不同app的互相影响

四、切换应用时后台APP清理机制

1.App切换时采用Lru Cache
2.onTrimMemory()回调方法:在系统内存发生变化时会发送给各个应用,在这里面可以进行一些不重要内存的回收,可以减少被清理的可能

五、监控内存的几种方法演示

1.Android studio代码

Float totalMemory = Runtime.getRuntime().totalMemory() * 1.0f / (1024 * 1024) // 运行中的总共内存
Float freeMemory = Runtime.getRuntime().freeMemory() * 1.0f / (1024 * 1024) // 运行时的空闲内存
Float maxMemory = Runtime.getRuntime().maxMemory() * 1.0f / (1024 * 1024) // 运行时的最大内存

2.AS下方的Android Monitor中的Monitors:可以实时显示内存的变化
3.AS中的Android Device Monitor:可以显示设备的具体线程,选择线程后点击Cause GC

六、APP内存优化方法

1.数据结构优化
1.1 频繁字符串拼接用StringBuilder
1.2 ArrayMap、SpareArray替换HashMap
1.3 内存抖动(申请了很多内存,很快就不用了,如此反复)
1.4 再小的Class至少也要耗费0.5KB
1.5 HashMap一个entry需要额外占用32B

2.对象复用
2.1 复用系统自带的资源
2.2 ListView/GridView中的contentView复用
2.3 避免在onDraw方法里面执行对象的创建

3.避免内存泄露
内存泄露:由于代码瑕疵,导致这块内存,虽然是停止不用了,但依然被其他东西引用着,使得GC没法对它回收
3.1 内存泄露会导致剩余可用Heap越来越少,频繁触发GC
3.2 尤其是Activity泄漏
3.3 尽量用Application Context而不是Activity Context

七、OOM问题优化
1.注意临时Bitmap对象的及时回收,避免Bitmap的浪费
2.Try Catch某些大内存分配的操作
3.加载Bitmap:缩放比例、解码格式、局部加载、软引用、缓存