OOM(Out Of Memory,内存溢出)是指程序在申请内存的时候,没有足够的内存空间供其使用,出现 Out Of Memory。比如申请了一个float,但给它存了double才能存下的数据,这就是内存溢出。
当我们的应用程序申请的内存资源超过Android系统为每个进程设置的最大内存限制时,系统就会抛出OOM错误。
1、查看手机每个应用程序最高可用内存
// 每个应用程序最高可用内存
int maxMemory = (int) (Runtime.getRuntime().maxMemory() / 1024);
// 使用Log打印出来
Log.i("TAG", "Max memory is " + maxMemory + "KB");
2、每个程序都会有可使用的内存上限,这被称为堆大小(Heap Size)。
ActivityManager manager = (ActivityManager) getSystemService(Context.ACTIVITY_SERVICE);
// 堆大小
int heapSize = manager.getMemoryClass();
// 使用Log打印出来
Log.i("TAG", "Heap size is " + heapSize + "MB");
注意:以上两种方式查看的内存大小是一样的。
避免OOM的常见方法
1、避免不必要的大图载入,在把图片载入内存之前,先计算出一个合适的缩放比例,然后再载入。
2、采用低内存占用量的编码方式,比如Bitmap.Config.ARGB_4444比Bitmap.Config.ARGB_8888更省内存。
3、使用图像缓存,比如在ListView中加载大量图片时,只加载屏幕显示的资源,尚未显示的不加载;移出屏幕的资源及时释放。
4、不要在循环中创建过多的本地变量,慎用static。用static来修饰成员变量时,该变量就属于该类,而不是该类实例,它的生命周期是很长的。
5、自定义堆内存分配大小。