1. SOF (堆栈溢出 StackOverflow)
StackOverflowError 的定义: 当应用程序递归太深而发生堆栈溢出时,抛出该错误。
因为栈一般默认为1-2m,一旦出现死循环或者是大量的递归调用,在不断的压栈过程中,造成栈容量超过1m而导致溢出。
栈溢出的原因:
- 递归调用
- 大量循环或死循环
- 全局变量是否过多数组、List、map数据过大
2. Android的OOM(Out Of Memory)
当内存占有量超过了虚拟机的分配的最大值时就会产生内存溢出(VM里面分配不出更多的page)。
一般出现情况:
- 加载的图片太多或图片过大时
- 分配特大的数组
- 内存相应资源过多没有来不及释放。
解决方法:
- 在内存引用上做处理
软引用是主要用于内存敏感的高速缓存。在jvm报告内存不足之前会清除所有的软引用,这样以来gc就有可能收集软可及的对象,可能解决内存吃紧问题,避免内存溢出。什么时候会被收集取决于gc的算法和gc运行时可用内存的大小。 - 对图片做边界压缩,配合软引用使用
- 显示的调用GC来回收内存
if(bitmapObject.isRecycled()==false) //如果没有回收
bitmapObject.recycle();
- 优化Dalvik虚拟机的堆内存分配
1.增强程序堆内存的处理效率
//在程序onCreate时就可以调用 即可
private final static floatTARGET_HEAP_UTILIZATION = 0.75f;
VMRuntime.getRuntime().setTargetHeapUtilization(TARGET_HEAP_UTILIZATION);
2 .设置堆内存的大小
//在程序onCreate时就可以调用 即可
private final static int CWJ_HEAP_SIZE = 6* 1024* 1024 ;
//设置最小heap内存为6MB大小
VMRuntime.getRuntime().setMinimumHeapSize(CWJ_HEAP_SIZE);
- 用LruCache 和 AsyncTask<>解决
从cache中去取Bitmap,如果取到Bitmap,就直接把这个Bitmap设置到ImageView上面。 如果缓存中不存在,那么启动一个task去加载(可能从文件来,也可能从网络)。