保存所有的App都会使用到的公共框架类、资源以及本地类库资源。
zygote受精卵的意思,可以分裂出很多细胞出来。
在Android里,Zygote是个进程,该进程中包含了所有的框架类,共用的资源,以及预加载的本地库。
只能被你的App使用,而其他App不能使用的内存。
数据仅仅存在于RAM中,一旦被清理,只能重新通过跑APP才能拿到数据。
数据不仅在RAM中,而且还保存在disk上,一旦被清理,再读取一下disk就好了。
一旦某个对象在APP中没有一个活动的引用。
注意,是活动的引用,我的理解是,引用它的对象是活动的,不是死的,如果两个死的引用互相引用,他们依旧会被回收掉。垃圾回收会先从根部的对象开始(知道这些对象是活动的并且正被进程所使用),并且沿着每个引用去查找它们的关联。如果一个对象不在这个有效引用的列表中,那么它肯定是不会再使用了,就可以被回收。此时,分配给这个对象的内存空间也可以回收了
在Gingerbread之前的版本,设备内存很小,所以App往往有较小的堆。垃圾收集器是一个“中断一切”的收集器,在垃圾收集的过程中,它会使所有CPU的进程和线程都停止。GC是中央集权制的。
在Gingerbread版本中,建立了一个并发的GC来做局部的回收工作。并发GC会和你的App一起运行,而不是阻止App运行。GC权利自治了。
在KitKat或者更早的版本运行的设备,内存回收,简单的进行 标记 及 清除 机制,这留下大量的碎片化自由内存,虽然总量很大,但是因为不是连续的,所以在申请超过最大自由内存碎片的体积时,就容易出现内存泄漏。
在Lollipop版本,Android运行时由Dalvik转变为ART,垃圾回收的效率又一次被提高了。在ART中,大型的对象(像是图片)有它们自己特殊的堆,这些堆是专门用于简化大型对象的内存管理用的(是这些大型对象的加速GC)。
ART垃圾回收算法:当一个App不在前台的时候,它将是一个Semi-Space的GC。因为App不在前台运行,重写在内存中的对象是安全的。过程是先将用到的内存数据逐块拷贝到一块新的内存区域,看第二行,这时内存是连续的。然后将这一大块连续的内存数据拷贝会然来的位置。这样碎片化自由内存被腾空了,注意,此时APP是被挂起的.
在一个设备上可以用到多少内存?ActivityManager.getMemoryClass将会返回App可以使用的堆的最大值。如果它显示的比理想的要小,你可以减少显示内容,又或者将图片转换为较小的格式。如果你的App是内存密集型的,可以请求getLargeMemoryClass()来获得更多内存,但是必须慎重使用它,因为在垃圾回收事件中,大的内存堆将会降低App的速度(因为此架构不得不通过查找更多的数据去捕获无用的对象)。
adb shell dumpsys meminfo
Proportional Set Size (PSS)
PSS 就是app所使用的全部内存。而 全部内存=私有内存 + 部分共享内存
该报告将整个内存的使用按照类型做了分类,
我想具体的了解某个app的内存使用情况。加上PID
adb shell dumpsys meminfo 1389
主要看几点:
* PSS Total
the total memory in use by the app (recall PSS = shared + private memory)
* the private dirty memory (memory only in use by the app, and not stored on disk).
可以看到大部分都是私有脏数据。
Objects表格统计了视图数量,资源数量,以及acitvity的数量。