概述
OOM(Out of Memory)即内存溢出,是因为应用所需要分配的内存超过系统对应用内存的阈值,而抛出的
java.lang.OutOfMemoryError
错误。 OOM的根本原因是开发者对内存使用不当造成的。
Android内存分配与回收机制
Android系统仅会在新的内存分配之前判断Heap的尾端剩余空间是否足够,如果不够就会触发GC操作,从而腾出更多空闲的内存空间。
内存分配
Android的Heap空间是一个
GenerationalHeapMemory
的模型,最近分配的对象会存放在YoungGeneration
区域,当一个对象在这个区域停留的时间达到一定程度,它会被移动到OldGeneration
,最后累积一定时间再移动到PermanentGeneration
区域。
内存回收
系统会根据内存中不同的内存数据类型分别执行不同的GC操作。例如,刚分配到
YoungGeneration
区域的对象通常更容易被销毁回收,同时在YoungGeneration
区域的gc操作速度回比OldGeneration
区域的gc速度更快。 每一个Generation的内存区域都有固定的大小,随着新的对象陆续被分配到此区域,当这些对象总的大小快达到这一级别内存区域的阈值时,会触发GC操作,以腾出空间来存放其他新的对象。 通常情况下,GC发生的时候,所有的线程都是会被暂停的。执行GC所占用的时间和它发生在哪一个Generation也有关系,YoungGeneration
中每次GC操作时间是最短的,OldGeneration
其次,Per
manentGeneration
最长。执行时间的长短也和当前Generation中的对象数量有关。