Android面试题——JVM

Android平台的虚拟机是基于栈的吗?

在这里插入图片描述
在这里插入图片描述

JVM运行时数据区

在这里插入图片描述

运行时栈

在这里插入图片描述

基于栈的虚拟机

在这里插入图片描述
在这里插入图片描述
第0行表示将一个Int型的1推送至操作数栈栈顶,程序计数器指向第0行。第一行字节码表示将栈顶的int型数值存入第一个本地变量,这两行代码就进行了给局部变量赋值的操作,第二三行同理。第4、5行表示将局部变量表的数入栈,第六行表示将栈顶两int型数值相加并将结果压入栈顶。第七行表示将单字节常量(-128~127)9推送至栈顶,因为这个字节占用两个字节码单元,所以下一行的行号是 9。9表示将栈顶两个数相乘并放入栈顶,第a行表示将栈顶的数存入本地变量。从这些操作我们可以看出都是操作操作数栈的。

Dalvik虚拟寄存器

JVM基于栈则意味着需要去栈中读写数据,所需的指令会更多,这样会导致速度变慢,对于性能有限的移动设备,显然不是很适合的。DVM是基于寄存器的,它没有基于栈的虚拟机在复制数据时而使用的大量的出入栈指令,同时指令更紧凑、更简洁。但是由于显式指定了操作数,所以基于寄存器的指令会比基于栈的指令要大,但是由于指令数量的减少,总的代码数不会增加多少.
在这里插入图片描述
在这里插入图片描述

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

各自特点

在这里插入图片描述

如何看待基于栈的虚拟机?

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

如何看待基于寄存器的虚拟机

在这里插入图片描述

为什么dex文件比class文件更适合移动端

在这里插入图片描述

在这里插入图片描述
在这里插入图片描述

class文件结构

在这里插入图片描述
在这里插入图片描述
· u1:1字节,无符号类型。
· u2:2字节,无符号类型。
· u4:4字节,无符号类型。
· u8:8字节,无符号类型。

文件头

在这里插入图片描述

常量池

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

类信息

在这里插入图片描述

字段表

在这里插入图片描述

方法表

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

属性信息

在这里插入图片描述

dex文件

在这里插入图片描述

class文件 vs dex文件

在Java SE程序中,Java类被编译成一个或多个.class文件,并打包成jar文件,而后JVM 会通过相应的.class 文件和jar 文件获取相应的字节码。执行顺序为.java 文件→.class文件→.jar文件,而DVM会用dx工具将所有的.class文件转换为一个.dex文件,然后DVM会从该.dex文件读取指令和数据。执行顺序为.java文件→.class文件→.dex文件。
jar文件里面包含多个.class文件,每个.class文件里面包含了该类的常量池、类信息、属性等。当JVM加载该.jar文件的时候,会加载里面的所有的.class文件,JVM的这种加载方式很慢,对于内存有限的移动设备并不合适。而在.apk文件中只包含了一个.dex文件,这个.dex文件将所有的.class里面所包含的信息全部整合在一起了,这样再加载就加快了速度。.class文件存在很多的冗余信息,dex工具会去除冗余信息,并把所有的.class文件整合到.dex文件中,减少了I/O操作,加快了类的查找速度。
在这里插入图片描述
在这里插入图片描述

索引区

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

你能不能自己写一个叫做java.lang.Object的类?

在这里插入图片描述
在这里插入图片描述

字节码加载

在这里插入图片描述

方法区

在这里插入图片描述

方法区实现

在这里插入图片描述

Java程序的双亲委派模型

在这里插入图片描述

Android程序的双亲委派模型

在这里插入图片描述
在这里插入图片描述

ClassLoader源码

在这里插入图片描述
在这里插入图片描述

加载自己写的Object类

在这里插入图片描述

双亲委派模型的好处

在这里插入图片描述

为什么要打破双亲委派模型

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

所有被new出来的实例,都是放在堆中的吗?

在这里插入图片描述

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

GC为什么会导致应用程序卡顿?

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

分代回收

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述


在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

垃圾检测算法

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

垃圾回收算法

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

Android平台虚拟机中的CG又是怎样的?

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

双重检测的单例,为什么还要加volatile关键字?

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

gujunhe

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值