Android GC学习

1GC简介
一般来说,程序使用内存的方式遵循先向操作系统申请一块内存,使用内存,使用完毕之后释放内存归还给操作系统。然而在传统的C/C++等要求显式释放内存的编程语言中,记得在合适的时候释放内存是一个很有难度的工作,因此Java等编程语言都提供了基于垃圾回收算法的内存管理机制。
垃圾回收器Garbage Collector(简称Collector)和垃圾回收Garbage Collection(简称GC)是不一样的概念。
垃圾收集器的职责是:
分配内存。
保证有引用的内存不被释放。
回收没有指针引用的内存。
对象被引用称为活对象,对象没有被引用称为垃圾对象,找到垃圾对象并回收是Collector的一个主要工作,该过程称为GC。
Collector一般使用一个称为堆的内存池来进行内存的分配和回收。 一般的,当堆内存满或者达到一个阀值时,堆内存或者部分堆内存被GC。
常见的垃圾回收算法有引用计数法(Reference Counting)、标注并清理(Mark and Sweep GC)、拷贝(Copying GC)和逐代回收(Generational GC)等算法,其中Android系统采用的是标注并清理和拷贝GC,并不是大多数JVM实现里采用的逐代回收算法。标记清理算法会产生内存空间碎片,拷贝GC避免了内存碎片但是造成了内存浪费。默认采用标注并清理GC算法。
2Dalvik内存管理
2.1关键结构体
2.1.1Heap
虚拟机通过一个名为Heap结构体来描述堆内存,Heap结构体主要成员变量为:
msp:mspace表示一个独立的内存空间区域,支持mspace_malloc等操作。
maximumSize:这个堆允许增长的最大值。
bytesAllocated:从mspace中为对象分配的空间大小,不仅是对象的大小还包括一些额外开销。
concurrentStartBytes:如果从mspace中分配的对象总大小超过了这个数值,就会触发GC_CONCURRENT。
objectsAllocated:当前mspace中分配的对象数量。
base:heap的基地址
limit:heap允许的最高地址。

猜你喜欢

转载自blog.csdn.net/qq_42894864/article/details/104075730
今日推荐