分享原因
- 调试过程记录非常详细,是很好排查思路学习和锻炼的学习资料
- Android基于Linux内核,Linux对线程、进程、描述符等限制参数的功能
- 技术文章
可以导致OOM的原因有以下几种:
- 文件描述符(fd)数目超限,即proc/pid/fd下文件数目突破/proc/pid/limits中的限制。可能的发生场景有:
- 短时间内大量请求导致socket的fd数激增,大量(重复)打开文件等
- 线程数超限,即proc/pid/status中记录的线程数(threads项)突破/proc/sys/kernel/threads-max中规定的最大线程数。可能的发生场景有:
- app内多线程使用不合理,如多个不共享线程池的OKhttpclient等等
- 传统的java堆内存超限,即申请堆内存大小超过了 Runtime.getRuntime().maxMemory()
- (低概率)32为系统进程逻辑空间被占满导致OOM.