Android 虚拟机、对象、变量的内存分配

什么是虚拟机?

虚拟机就是将平台无关的.class文件的字节码翻译成平台相关的机器码,来实现跨平台;

jvm:Java 文件->编译器>class字节码->JVM->机器码

android:Java 文件->编译器>class字节码->dex工具->dex->aapt工具->apk

java的jvm虚拟机与Android的虚拟机有什么区别?

  1. java执行的是.class文件;Android虚拟机执行的是.dex文件;
  2. class文件存在的冗余信息;dex工具将多个class编译成dex时会去除这些冗余信息;
  3. jvm是基于虚拟机栈的虚拟机;Android虚拟机是基于寄存器;

Android的Dalvik虚拟机和Art虚拟机有什么区别?

  1. Dalvik虚拟机是5.0之前的;Art虚拟机是5.0出来的;
  2. Dalvik虚拟机,运行时,JIT编译器实时将dex文件中的字节码翻译成机器码;比较耗cpu资源;
  3. Art虚拟机,是在安装的时候将dex文件中的字节码翻译成机器码,储存起来,运行时执行速度比较快;
  4. ART虚拟机在7.0之后,是安装时没有翻译,运行时翻译,翻译之后储存起来了,之后再运行就不再需要翻译了;
  5. ART运行时,减少了实时翻译,减少了cpu使用,用电续航就增加了;

class和dex有什么区别(为什么Android要用Dex文件,而不用class文件)?

  1. dex文件就像压缩文件,将很多class压缩成了一个文件;
  2. dex文件将所有的class中的方法、常量、变量等,按照类型,放到了一起;(将class分解、零件分类存放)
  3. dex一次io可以加载多个类,而class需要多次io;
  4. class文件存在的冗余信息;dex工具将多个class编译成dex时会去除这些冗余信息;
  5. dex指令少,而class指令密集且多
  6. dex寄存器设计方便寻址,而class,java需要多次load和store指令;
  7. dex适合移动设备,对性能要求不高;class适合pc大内存,单指令小的时候可以快速执行;

虚拟机栈和寄存器有什么区别?

  1. java虚拟机基于栈结果,指令密集且多,每个指令只占一个字节(因而称为字节码),指令多分发指令也就多,从而影响执行效率;
  2. Android虚拟机寄存器,需要使用原地址和目标地址,需要更多的指令空间,有的指令需要2-3个字节(用空间换时间);一个指令执行多个操作,指令少,分发指令也就少,执行更高效;但是更多指令空间,容易指令丢失失效;

内存分为:

  1. 方法区
  2. 虚拟机栈(new一个线程就会创建一个虚拟机栈 )

方法区:

存放类信息、static常量;

堆:

存放new的对象、final修饰的对象;

虚拟机栈:

存放方法的局部变量;

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值