Skip to content

Commit 0420348

Browse files
committed
完善执行引擎笔记
1 parent b627661 commit 0420348

File tree

4 files changed

+109
-8
lines changed

4 files changed

+109
-8
lines changed

java/0-JavaSE/g-JVM/1.JVM内存区域与内存溢出异常.md

Lines changed: 30 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -14,9 +14,37 @@ Java虚拟机特点:
1414

1515
- 自动内存管理
1616

17-
- 自动垃圾回收功能
17+
- 自动垃圾回收功能r
1818

19-
### 2. JVM内存区域划分
19+
<br>
20+
21+
### 2. JVM生命周期
22+
23+
#### 虚拟机的启动
24+
25+
Jaya虚拟机的启动是通过引导类加载器(bootstrap class loader)创建-初始类(initial class)来完成的,这个类是由虚拟机的具体实现指定的。
26+
27+
#### 虚拟机执行
28+
29+
- 一个运行中的Java虚拟机有着一个清晰的任务:执行Java程序。
30+
- 程序开始执行时他才运行,程序结束时他就停止。
31+
- 执行一个所谓的Java程序的时候,真真正正在执行的是一个叫做 **Java虚拟机的进程**
32+
33+
#### 虚拟机的退出
34+
35+
有如下的几种情况:
36+
37+
1. 程序正常执行结束
38+
39+
2. 程序在执行过程中遇到了异常或错误而异常终止
40+
41+
3. 由于操作系统出现错误而导致Java虚拟机进程终止
42+
43+
4. 某线程调用Runtime类或system类的exit方法,或Runtime类的halt方法,并且Java安全管理器也允许这次exit或halt操作。
44+
45+
> 除此之外,JNI(Java Native Interface)规范描述了用JNI Invocation API来加载或卸载 Java虚拟机时,Java虚拟机的退出情况。
46+
47+
### 3. JVM内存区域划分
2048

2149
**JVM内存区域划分 ---- 6大区域**
2250

java/0-JavaSE/g-JVM/2.JVM垃圾回收器与内存分配策略.md

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
1+
22

33
[TOC]
44

@@ -18,8 +18,8 @@
1818

1919
**a. 引用计数法(Python,C++)**
2020

21-
- ==给每个对象附加一个引用计数器==,每当有引用指向当前对象时,计数器 +1;每当有引用不再指向当前对象时,计数器 -1
22-
- 任意时刻,引用计数器值为0的对象,被标记为 =="不在存活"==
21+
- 给每个对象附加一个引用计数器,每当有引用指向当前对象时,计数器 +1;每当有引用不再指向当前对象时,计数器 -1
22+
- 任意时刻,引用计数器值为0的对象,被标记为"不在存活"
2323
- 缺点 :无法解决循环引用问题(我中有你,你中有我)
2424

2525
**b. 可达性分析算法(Java,C#)**

java/0-JavaSE/g-JVM/c-执行引擎/09.执行引擎.md

Lines changed: 20 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,24 @@ JVM的主要任务是负责装载字节码到其内部,但字节码并不能
1818

1919
简单来说,JVM中的执行引擎充当了将高级语言翻译为机器语言的翻译官。
2020

21-
## 2. 执行引擎工作过程
21+
22+
23+
## 2. Java代码执行流程
24+
25+
![image-20220904200124942](https://iqqcode-blog.oss-cn-beijing.aliyuncs.com/img/202209042001979.png)
26+
27+
Java源代码前端编译器生成字节码文件(执行`javac`指令),在编译过程中涉及到
28+
29+
- 词法分析
30+
- 语法分析
31+
- 构建抽象语法树
32+
- 生成字节码
33+
34+
生成字节码文件后,由JVM解析/编译执行,最终在操作系统上执行机器指令
35+
36+
37+
38+
## 3. 执行引擎工作过程
2239

2340
![](https://iqqcode-blog.oss-cn-beijing.aliyuncs.com/img/20200707091130.png)
2441

@@ -30,7 +47,7 @@ JVM的主要任务是负责装载字节码到其内部,但字节码并不能
3047

3148
-----------------------------------------------
3249

33-
## 3. 前端编译器与后端编译器
50+
## 4. 前端编译器与后端编译器
3451

3552
> 👉参考文章【[Java编译分类:前端编译和后端编译是如何划分的](https://blog.csdn.net/yu870646595/article/details/78987805)
3653
@@ -88,7 +105,7 @@ JVM的主要任务是负责装载字节码到其内部,但字节码并不能
88105

89106
--------------
90107

91-
## 4. Java程序的编译与执行
108+
## 5. Java程序的编译与执行
92109

93110
![](https://iqqcode-blog.oss-cn-beijing.aliyuncs.com/img/20200707093416.png)
94111

Lines changed: 56 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,56 @@
1+
## 1. 为什么学习
2+
3+
1. 学习这些知识不能帮助到业务逻辑,但是他们加深你的视野,对原理的掌握翻译你的工作经验
4+
2. 对虚拟机运行流程有一个深刻认知,加深对APP运行机制的理解
5+
3. 字节码插桩
6+
4. 对反编译,热修复,插件化有帮助,我们把dex理解了,能帮助我们理解其中原理
7+
8+
9+
10+
<img src="https://iqqcode-blog.oss-cn-beijing.aliyuncs.com/img/202206120825370.png" alt="android-stack_2x" style="zoom:50%;" />
11+
12+
Java虚拟机是基于栈的虚拟机,Dalvik/ART是基于寄存器的虚拟机
13+
14+
**基于栈的虚拟机**
15+
16+
对于基于栈的虚拟机来说,每一个运行时的线程,都有一个独立的栈。栈中记录了方法调用的历史,每有
17+
一次方法调用,栈中便会多一个栈侦。最顶部的栈侦称作当前栈帧,其代表着当前执行的方法。基于栈的
18+
虚拟机通过操作数栈进行所有操作。
19+
20+
![image-20220612094855931](https://iqqcode-blog.oss-cn-beijing.aliyuncs.com/img/202206120948954.png)
21+
22+
`.class`文件
23+
24+
25+
26+
**基于寄存器的虚拟机**
27+
28+
基于寄存器的虚拟机中没有操作数栈,但是有很多虚拟寄存器。其实和操作数栈相同,这些寄存器也存放
29+
在运行时栈中,本质上就是一个数组。与JVM相似,在DalvikVM中每个线程都有自己的PO和调用栈,方法
30+
调用的活动记录以帧为单位保存在调用栈上。
31+
32+
![image-20220612101246691](https://iqqcode-blog.oss-cn-beijing.aliyuncs.com/img/202206121012724.png)
33+
34+
35+
36+
------
37+
38+
## 2. ART与Dalvik
39+
40+
Dalvik虚拟机执行的是dex字节码,解释执行。从Android 2.2版本开始,支持JIT即时编译(Just In Time)
41+
在程序运行的过程中进行选择热点代码(经常执行的代码)进行编译或者优化。2732168745
42+
而ART(Android Runtime)是在Android4.4中引入的一个开发者选项,也是Android5.0及更高版本的默认
43+
Android运行时。ART虚拟机执行的是本地机器码。Android的运行时从Dalvik虚拟机替换成ART虚拟机,并不要
44+
求开发者将自己的应用直接编译成目标机器码,APK仍然是一个包含dex字节码的文件。
45+
46+
![image-20220612101748390](https://iqqcode-blog.oss-cn-beijing.aliyuncs.com/img/202206121017417.png)
47+
48+
49+
50+
51+
52+
- [ ] Android 5.0 正式将Dalvik切换为ART,同体积APK在闪存相同的情况下,ART安装APK会耗时较长,具体做了那些事?
53+
54+
Android 9.0及之后,ART安装耗时做了优化,安装速度又不再那么慢
55+
56+
![image-20220612102133989](https://iqqcode-blog.oss-cn-beijing.aliyuncs.com/img/202206121021017.png)

0 commit comments

Comments
 (0)