Android技术知识Java 杂谈

Android OOM问题的What Where How

2019-05-17  本文已影响0人  魏树鑫

知己知彼,百战不殆。
要想解决和避免OOM,必须先知道OOM是什么,在哪里会发生,最后才是怎样去解决OOM;

What?什么是OOM

OOM --> java.lang.OutOfMemoryError

内存溢出,应用内存占用过高,虚拟机无法再分配更多的内存,这时系统就会抛出OOM,JVM规范中划定了大部分区域的内存的管理,可参考JVM规范官方文档:https://docs.oracle.com/javase/specs/jls/se8/html/jls-15.html#d5e24307

Where & How? 哪里会出现OOM,怎么解决

首先要了解运行时内存区域的划分,可参考我的博客:
https://blog.csdn.net/u013360790/article/details/89510941
JVM除了程序计数器没有对内存做限制,其他内存区域都可以抛出OOM;
主要分为三大块,线程共享的堆和方法区,以及线程私有的栈,包括虚拟机栈和本地方法栈;

根据JDK和Android 8.0源码,看下都什么地方Throw OutOfMemoryError

如果查找几个就会看出问题,系统都在什么情况下会抛出OOM,知道如何引起,自然知道如何避免和解决了;

还有很多细节平时多注意就好;
Android 可以使用LeakCanary来监控Context的泄漏,并能生成内存快照;
然后可以使用Android Studio或者Mat来对heep dump进行分析;

上一篇下一篇

猜你喜欢

热点阅读