Android虚拟机的理解和内存管理

虚拟机很小,空间很小,谈谈移动设备的虚拟机的大小限制 16M ,
谈谈加载图片的时候怎么处理大图片的,
outmemoryException
BitmapFactory.option 
垃圾回收,没有引用的对象,在某个时刻会被系统gc掉 .

Dalvik和标准Java 虚拟机 (JVM)首要差别
Dalvik 基于 寄存器 ,而 JVM 基于栈。
基于 寄存器 虚拟机 对于编译后变大的程序来说,在它们执行的时候,花费的时间更短。
Dalvik和Java运行环境的区别
1:Dalvik主要功能:完成对象生命周期管理, 堆栈 管理,线程管理,安全和异常管理,以及 垃圾回收 等等重要功能。
2:Dalvik负责:进程隔离和线程管理,每一个Android应用在底层都会对应一个独立的Dalvik 虚拟机 实例,其代码在虚拟机的解释下得以执行。
3:不同于Java 虚拟机 运行java 字节码 ,Dalvik虚拟机运行的是其专有的 文件格式 Dex
4:dex 文件格式 可以减少整体文件尺寸,提高I/O操作的类查找速度。
5:odex是为了在运行过程中进一步提高性能,对dex文件的进一步优化。
6:所有的Android应用的线程都对应一个Linux线程, 虚拟机 因而可以更多的依赖 操作系统 线程调度 和管理机制。

7:有一个特殊的虚拟机进程Zygote,他是虚拟机实例的孵化器。

      它在系统启动的时候就会产生,它会完成虚拟机的初始化,库的加载,预制类库和初始化的操作。

      如果系统需要一个新的虚拟机实例,它会迅速复制fork()自身,以最快的数据提供给系统。对于一些只读的系统库,所有虚拟机实例都和Zygote共享一块内存区域。

8:Dalvik是由Dan Bornstein编写的,名字来源于他的祖先曾经居住过名叫Dalvík的小渔村,村子位于冰岛

        许多GC实现都是在对象开头的地方留一小块空间给GC标记用。Dalvik VM则不同,在进行GC的时候会单独申请一块空间,以位图的形式来保存整个堆上的对象的标记,在GC结束后就释放该空间。 

    Dalvik是执行的时候编译+运行,安装比较快,开启应用比较慢,应用占用空间小;

    ART是安装的时候就编译好了,执行的时候直接就可以运行的,安装慢,开启应用快,占用空间大。

用个比喻来说就是,骑自行车dalvik 是已经折叠起来的自行车,每次骑都要先组装自行车才能骑。

ART是已经组装好的自行车,每次骑直接上车就能走人效率高在开启的时候,运行中的速度是差不多的。


 Android的内存管理

   Android的程序由Java语言编写,所以Android的内存管理与Java的内存管理相似。程序员通过new为对象分配内存,所有对象在java堆内分配空间;然而对象的释放是由垃圾回收器来完成的。C/C++中的内存机制是“谁污染,谁治理”,java的就比较人性化了,给我们请了一个专门的清洁工(GC)。

GC是垃圾收集的意思(GabageCollection),内存处理是编程人员容易出现问题的地方,忘记或者错误的内存回收会导致程序或系统的不稳定甚至崩溃,Java提供的GC功能可以自动监测对象是否超过作用域从而达到自动回收内存的目的,Java语言没有提供释放已分配内存的显示操作方法。

垃圾回收的优点和原理 

   Java语言中一个显著的特点就是引入了垃圾回收机制,使得Java程序员在编写程序的时候不再需要考虑内存管理。垃圾回收可以有效的防止内存泄露,有效的使用可以使用的内存。垃圾回收器通常是作为一个单独的低级别的线程运行,不可预知的情况下对内存堆中已经死亡的或者长时间没有使用的对象进行清楚和回收,程序员不能实时的调用垃圾回收器对某个对象或所有对象进行垃圾回收。回收机制有分代复制垃圾回收和标记垃圾回收,增量垃圾回收。

    对于GC来说,当程序员创建对象时,GC就开始监控这个对象的地址、大小以及使用情况。通常,GC采用有向图的方式记录和管理堆(heap)中的所有对象。通过这种方式确定哪些对象是"可达的",哪些对象是"不可达的"。当GC确定一些对象为"不可达"时,GC就有责任回收这些内存空间。程序员可以手动执行System.gc(),通知GC运行,但是Java语言规范并不保证GC一定会执行

Android系统中GC出现内存泄露 

    导致内存泄漏主要的原因是,先前申请了内存空间而忘记了释放。如果程序中存在对无用对象的引用,那么这些对象就会驻留内存,消耗内存,因为无法让垃圾回收器GC验证这些对象是否不再需要。如果存在对象的引用,这个对象就被定义为"有效的活动",同时不会被释放。要确定对象所占内存将被回收,我们就要务必确认该对象不再会被使用。典型的做法就是把对象数据成员设为null或者从集合中移除该对象。但当局部变量不需要时,不需明显的设为null,因为一个方法执行完毕时,这些引用会自动被清理。Java 内存泄露的根本原因就是 保存了不可能再被访问的变量类型的引用。

 Android的内存溢出

   因为系统为每一个dalvik虚拟机分配的内存是有限的,它的最大堆大小一般是16M,有的机器为24M。也就是说我们所能利用的内存空间是有限的。如果我们的内存占用超过了一定的水平就会出现OutOfMemory的错误。

 内存不够用的原因

    由于我们程序的失误,长期保持某些资源(如Context)的引用,造成内存泄露,资源造成得不到释放。保存了多个耗用内存过大的对象(如Bitmap),造成内存超出限制。 

     Framework 工作原理

Framework是android 系统对 linux kernel,lib库等封装,提供WMS,AMS,bind机制,handler-message机制等方式,供app使用。

Activity 是如何生成一个 view

1)Activity在attch方法的时候,会创建一个phonewindow(window的子类)

2)onCreate中的setContentView方法,会创建DecorView

3)DecorView 的addview方法,会把layout中的布局加载进来。



猜你喜欢

转载自blog.csdn.net/zhangcanyan/article/details/80725309