Android性能:内存篇之内存回收
在学会内存性能优化之前我们得先了解内存如何回收,在《Android性能:内存篇之虚拟机概论》我们已经了解了虚拟机的概念及JVM结构体系与内存空间,在《Android性能:内存篇之进程内存管理》中已了解到系统如何通过管理进程处理内存,接下来我们详细了解进程内部如果管理内存。
一、内存回收
一般来说,程序使用内存的方式遵循先向操作系统申请一块内存,使用内存,使用完毕之后释放内存归还给操作系统。然而在传统的C/C++等要求显式释放内存的编程语言中,记得在合适的时候释放内存是一个很有难度的工作,因此Java等编程语言都提供了基于垃圾回收算法的内存管理机制。
Garbage Collection(GC)
Garbage Collection(垃圾回收机制)主要是处理 Java堆Heap ,和部分方法区内的对象。而栈区的数据,在超出作用域后会被JVM自动释放掉,所以其不在JVM GC的管理范围内。
Stop-the-world
在学习Java GC 之前,我们需要记住一个单词:stop-the-world 。它会在任何一种GC算法中发生。Stop-the-world 意味着JVM因为需要执行GC而停止了应用程序的执行。当stop-the-world 发生时,除GC所需的线程外,所有的线程都进入等待状态,直到GC任务完成。GC优化很多时候就是减少stop-the-world 的发生。
二、垃圾回收算法
在JVM规范中并没有明确GC的运作方式,各个厂商可以采用不同的方式去实现垃圾回收器。这里讨论几种常见的GC算法。常见的垃圾回收算法有引用计数法(Reference Counting)、标注并清理(Mark and Sweep GC)、拷贝(Copying GC)、标注并整理回收法(