分析工具
OOM发生以后,使用Android Studio 自带的Android Monitor dump出HPROF文件,然后使用SDK中的hprof-conv(位于sdk_root/platform-tools)工具转换为标准的Java堆转储文件格式,这样就可以使用MAT继续分析
Android OOM类型:
- 使用static修饰Context变量,Context被Hold住了导致Activity无法销毁
- Bitmap没有及时回收,调用recycle()函数并不能立即释放Bitmap,读取Bitmap到内存的时候没有做采样率的设置;
if(bitmap != null && !bitmap.isRecycled()){
// 回收并且置为null
bitmap.recycle();
bitmap = null;
}
System.gc();
- 线程数超限,proc/pid/status中记录的线程数超过proc/sys/kernel/threads-max中规定的最大线程数,比如随意创建线程,没有使用线程池来管理
- 文件描述符(fd)超限,proc/pid/fd 下文件数目超过proc/pid/limits中的限制,场景如大量的Socket请求或者文件打开操作
- Cursor使用问题,使用完之后没有及时关闭
- Java堆内存超限,申请的堆内存超过Runtime.getRuntime().maxMemory().
栈内存用来存储局部变量和方法调用,栈内存的线程是私有的&#