您的位置:首页 > 移动开发 > Android开发

Android 虚拟机,内存管理,垃圾回收 相关

2017-06-19 14:04 169 查看
直入正题,android虚拟机 我们可以从 java虚拟机,dalvik虚拟机 和 ART虚拟机来看,而很明显,dalvik虚拟机 和 ART虚拟机都是基于java虚拟机,那么我们先来看看 java虚拟机相关知识:

首先看看class文件和dex文件:

class文件:能被jvm识别并加载的文件,我们写的 *.java源代码会通过 javac 命令被编译成class文件被java虚拟机识别

dex文件具体可以看看这篇博文 我们简单的理解就是class文件的打包,能被dalvik虚拟机识别并加载的文件;

那么接下来就是看看文件是怎么被加载到 java虚拟机的:

加载流程: 1.loading:从文件中获取类信息 并加载到jvm内存里面

2.verifying:检查读入的文件信息是否符合jvm的规范

3.preparing:分配一个数据结构来储存类信息

4.resolving:把这个类的常量池所有的符号引用改变成直接引用

5.initializing:执行静态初始化程序,把静态变量初始化成指定值

那么我们简单的总结下就是:读取到class文件之后,先对其进行验证,验证合法之后先加载类信息,再转成对象,并初始化值。

既然文件已经加载,那么我们就再来看看他们再内存中是怎么个情况:

内存基本概况:

1.栈区:

java栈区:存放了java方法执行时所有的数据,由栈帧(一个栈帧代表一个方法执行)组成。

java栈帧:每个方法从调用到执行完成就对应一个栈帧在虚拟机中的入栈到出栈

2.本地方法栈:专门为本地方法提供的栈

3.方法区:储存了被虚拟机加载的类信息,常量,静态变量,即时编译器编译后等数据

4.堆区:所有通过new创建的对象都在堆区(分 新生带 和 老生带),gc回收的主要模块。

基本上再java虚拟机中就是这4个分区了,而我们重点关注的应该是再堆区了,也是我们接下来需要来说说的 垃圾回收

垃圾回收

关于垃圾回收 我们分三个小模块:收集算法,回收算法,以及 回收时机。

垃圾收集算法:

1.引用计数算法 (jdk1.2之前都是):有新引用 引用计数+1,移除的时,计数-1,但是这种方法再两个对象相互引用时,会导致两个对象一直都有引用数,而使得其一直不被回收。

2.可达性算法:gcroot根节点寻找可达对象,而什么是可达对象呢,我们可以这么简单理解,通过引用链能达到gcroot根节点的都是可达对象,比如下图:

ABE是可达对象,CD虽然都有引用,但是无法找到GCROOT,视为不可达对象,那么CD就是垃圾了。



垃圾回收算法:

1.标记——清除算法:不可达的会标记为可回收对象,回收时直接回收标记的对象,对于大量内存回收极为高校,但是会产生垃圾碎片

2.复制算法:将可达的对象复制到新内存空间,最后清除旧内存空间,存活对象少时高效,但是需要另外一个内存空间作为交换对象。

3.标记–整理算法:在标记清除算法上,让内存都朝一边移动,进行内存整理,避免了内存碎片,但相对的 性能可定是有一定消耗的。

触发回收:

1.java虚拟机无法再为新对象分配空间了

2.system.gc()

3.低优先级的gc线程被运行时会gc

整篇文章相对 比较基础,也主要是抓的知识点 ,对于面试前可以看看,希望对你有点点帮助!
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息