Jvm与DVM与ART

JVM虚拟机

JVM 的执行的指令是基于结构,需要去栈中读写数据,指令会变多,导致速度变慢。执行编译后的.class文件,执行顺序为:.java 文件 → .class 文件 → .jar 文件。

1、JVM内存模型

jvm分为五部分:堆、栈、方法区(一种规范定义,非实现)、本地方法栈、程序计数器

1.1、堆

jvm所管理的内存中最大的一部分、线程共享的内存区域,主要存放对象的实例和数组。堆根据对象的存活周期不同把堆分为:新生代、老年代和(jdk1.8以后)元空间,新生代与老年代比例约1:2,分代的原因是因为根据程序的运行会生成很多对象存放在堆中,堆内存需要频繁的进行垃圾回收,若不分代每次遍历对象会严重的影响GC的效率。

1.1.1、新生代

新生代又分为Eden、Surviver(分为to、from),比例约8:2,所采用的的Minor GC算法是复制算法,几乎所有新成的对象(除大对象外,Eden区存放不下的大对象会直接移动到老年代)都会存放在Eden区,Minor GC之前会遍历一次把存活的对象复制到surviver区,然后清除Eden区,90%的对象在Eden区被清理。

1.1.2、老年代

老年代即Old区,存放的对象都是大对象或者多次通过Minor GC后存活下来的对象,老年代中的对象生命周期较长,存活率比较高,在老年代中进行Full GC的频率相对而言较低,而且回收的速度也比较慢。老年代中采用的Full GC的算法是标记清除、标记整理,标记清除是为了清理可被回收的对象,需要遍历两次,标记整理是为了将对象移动至一遍使内存变成连续的空间,清理内存碎片。

注:判断一个对象是否是垃圾对象:
1、引用计数法
给每个对象定义一个变量,存储引用数。就是通过引用计数是否为0去判断是否清理。(难以解决循环引用问题)
2、可达性分析法
会记录对象的引用链,如果一个对象没有引用链,就证明这个对象没有使用,那么就会销毁。
2.1、GC roots对象是哪些呢

	虚拟机栈中引用的对象
	方法区中类静态属性引用的对象
	方法区中常量引用的对象
	本地方法栈中JNI[即一般说的Native]引用的对象

1.2、虚拟机栈

虚拟机栈中存放的数据:局部变量表、操作数栈、动态链接、方法返回地址线程私有,生命周期与线程相同。每一个方法从调用直至执行完成的过程,就对应着一个栈帧在虚拟机栈中入栈到出栈的过程。

1.3、方法区(永久代即jdk1.8以后的存放于堆中的元空间)

方法区存放的数据:已被虚拟机加载的 类信息、常量、静态变量、即时编译器编译后的代码 等数据,运行时常量池。线程共享的内存区域

1.4、本地方法栈

与虚拟机栈一样,但本地方法栈则为虚拟机使用到的 Native 方法服务。线程私有。

1.5、程序计数器

内存空间小,线程私有,字节码解释器工作是就是通过改变这个计数器的值来选取下一条需要执行指令的字节码指令,分支、循环、跳转、异常处理、线程恢复等基础功能都需要依赖计数器完成。

DVM 虚拟机

DVM 是基于寄存器的结构,没有想jvm时一样复制数据时,有大量的出入栈指令,同时指令更紧凑、更简洁,但是由于指定了操作数,所以指令会比基于栈的指令大,但是由于指令数量的减少,总的代码不会增加多少。执行编译后的.dex文件,执行顺序为:.java 文件 → .class 文件 → .dex 文件。

注:DVM是由zygote进程创建和初始化的,zygote是第一个DVM进程;zygote通过fork复制自身创建和初始化一个进程(fork函数默认返回进程id,创建失败返回-1)

DVM堆

DVM运行时堆由两个 Space 以及多个辅助数据结构组成,采用GC的算法是标记清除,两个Space分为Zygote Space(Zygote Heap)和 Allocation Space(Active Heap);Zygote Space 用来管理 Zygote 进程在启动过程中预加载和创建的各种对象,Zygote Space 中不会触发 GC,在 Zygote 进程和应用程序进程之间会共享 Zygote Space。 Zygote 进程 fork 第一个子进程之前会把 Zygote Space 分为两部分,原来的已经被使用的那部分堆仍称为 Zygote Space,而未使用的那部分堆称为 Allocation Space

DVM GC原因

1、当堆开始填充时,并发 GC 释放内存
2、当堆已满时,App 尝试分配内存而引起 GC,系统必须停止 App 并回收内存。
3、当请求创建 HPROF 文件来分析堆内存时出现 GC。
4、显式的 GC,例如调用 System.gc()(应避免显式的调用 GC,信任 GC 会在需要时运行)。
5、仅适用于 API 级别小于等于 10,且用于外部分配内存的 GC。

ART虚拟机

ART(Android Runtime)虚拟机是 Android 4.4 发布的,用来替换 Dalvik 虚拟机,Android 4.4 默认采用 DVM,但是可以选择使用 ART。在 Android 5.0 版本中默认使用 ART。ART虚拟机在安装的时候会进行一次与编译即AOP,将字节码预先编译成机器码并存储在本地,这样应用程序每次运行时就不需要执行编译了,运行 效率会大大提升,设备的耗电量也会降低。缺点:第一个是 AOT 会使得应用程序的安装时间变长,尤其是一些复杂的应用;第二个是字节码预先编译成机器码,机器码需要的存储空间会多一些。

待完善。。。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值