Android 内存回收机制
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Android 内存回收机制相关的知识,希望对你有一定的参考价值。
参考技术A
新生代的内存区域又被分成三部分,分别是Eden、s0、s1,在hotspot中它们的默认是比例是8:1:1,为什么是这个比例下面会解释。每次分配新对象都是从Eden中分配,新生代的gc过程是,通过gc root对象(gc root对象包括:在栈帧中的对象、native栈中的对象、静态对象)标记存活的对象,并且把存活的对象拷贝到s0中然后清空Eden,接下来的gc又会把Eden和s0存活的对象拷贝到s1中,s0和是s1总有一个是空闲的,gc过程就是把Eden和其中一个s的存活对象拷贝到另一个s中,然后清空s和Eden。为什么Eden:s0:s1是8:1:1呢?那是因为新生代对象经过一次gc后存活的概率只有5%左右,之前IBM统计过,正是因为新生代经过gc后存活的对象很少,才会使用拷贝擦除这种方法。gc最快的方法就是把没有被gc root对象直接引用或者间接引用的对象标记为无效,但是这样势必会造成大量的内存碎片,所以综合考虑最终在新生代使用拷贝擦除这种算法
在新生代中经过多次gc后仍然存活的对象则会晋升为老年代对象。老年代对象的gc比新生代更耗时。
老年代的gc过程是:
由于android作为一个终端,需要快速的响应用户的操作,而gc过程又要暂停所有的线程,所以必须要保证的gc的时间不会太长。在Android中应用启动的时候一般会分配一段内存作为初始内存,在应用的运行过程需要创建一个新对象,而初始分配的内存空间已经无法提供足够的内存,此时就会触发gc,如果gc过后还是没有足够内存则会对堆内存进行扩容,扩容到最大值后还是没有提供足够的内存则会再进行一次gc,这次gc会把软引用也清空,如果仍然没有足够的内存就抛出oom。
总结起来 Android系统不会一次性就把堆内存分配给应用进程,这样会导致gc的时间很长,用户的操作长时间得不到响应,而是分步给应用进程的堆内存进行扩容直到最大限制值
Android垃圾回收机制--二
以上是关于Android 内存回收机制的主要内容,如果未能解决你的问题,请参考以下文章
Android内存优化1 了解java GC 垃圾回收机制3