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垃圾回收机制--二

1. 哪些情况下的对象会被垃圾回收机制处理掉
答案:
1)发现无用信息对象
2)回收被无用对象占用的空间的内存空间,使该空间可被程序再次使用
2.垃圾回收机制的意义
Java语言中的一个显著的特点就是引入了垃圾回收机制,使C++程序员最头疼的内存管理的问题迎刃而解,它使得Java程序员在编写程序的时候不在需要考虑内存管理。由于有个垃圾回收机制,Java中的对象不在有“作用域”的概念,只有对象的引用才有“作用域”。垃圾回收可以有效防止内存泄漏,有效的使用空闲的空间
PS:内存泄漏是指该内存空间使用完毕之后未收回,在不涉及复杂数据结构的一般情况下,Java的内存泄漏表现为一个内存对象的生命周期超出了程序需要它的时间长度,我们有时也将其称为“对象游离
 
3. 内存回收机制
1)采用标记计数的方法给内存中的对象给打上标记,对象被引用一次,计数就加1,应用被释放了,计数就减1,当这个计数为0的时候,这个对象就可以被回收了,当然,这也就引发了一个问题:循环引用的对象是无法被识别出来并且被回收的,所以就有了第二个方法:
2)采用根搜索算法从一个根出发,搜索所有的可达对象,这样剩下的哪些对象就是需要被回收的

以上是关于Android 内存回收机制的主要内容,如果未能解决你的问题,请参考以下文章

Android内存优化1 了解java GC 垃圾回收机制3

Android垃圾回收机制--二

Android内存回收机制

android 垃圾回收机制

Android内存优化1 了解java GC 垃圾回收机制1

Android 操作系统的内存回收机制