Android 虚拟机理解

( Android虚拟机是指Dalvik/Art,不算100%java虚拟机,但源出一脉。)

概念:

java虚拟机要解决的核心问题-->write once, run anywhere,为了解决这一问题,需要把java文件编译为中间状态的字节码Bytecode,然后在运行阶段根据具体平台做“转译”,译为对应平台的机器码。

 

理解:

JVM的首要任务就是执行Java程序,通常情况下一个虚拟机实例与程序的生命周期是绑定在一起的。

JVM中的线程可以分为保护线程daemon和non-daemon。前者是指VM自身使用的线程,如执行垃圾回收的工作线程。

JVM的处理逻辑和物理机是同理的,while(true){取指令;执行指令;调整寄存器中的值}。

 

具体分析:

1. ClassLoader和双亲委派模型(虚拟机加载java类的方式)

1. 通常有如下4种classloader:Bootstrap ClassLoader、Extension ClassLoader、System ClassLoader、User ClassLoader,既然要加载java类,那么首先应该有个loader类是非java的来生第一个蛋,这个类就是Bootstrap ClassLoader(由C/C++写成)。

2. 根据规定,任何一个类都需要由加载它的ClassLoader和它的类名来唯一确定,为了避免不同loader加载的同一个类生成的对象之间没有关系所造成的混乱,就需要程序中的基础类都处于同一空间域中,所以使用了双亲委派模型。

3. 解释双亲委派模型:加载类时候需要看这个类的加载终态是否已存在于虚拟机中,由User ClassLoader去Cache中查,有就直接返回结果,没有就委派它的上级去查这个类在上级的状态是否存在,没有就继续向上直到Bootstrap ClassLoader。

2. 运行时数据区域

1. 由堆、栈、方法域等组成。

2. 堆内存空间是所有JVM线程共享的。方法域也是(一个进程就是一个java虚拟机实例)so进程独立,线程共享。

3. 堆和垃圾回收

1. 较为流行的回收算法为:分代垃圾回收算法。内存划分为:年轻代、老年代、永久代。永久代不属于堆内存,一般不考虑垃圾回收。

 

4. 执行引擎

( java字节码解释执行)

 

posted @ 2022-03-24 15:14  小汀  阅读(114)  评论(0编辑  收藏  举报