File tree Expand file tree Collapse file tree 4 files changed +109
-8
lines changed Expand file tree Collapse file tree 4 files changed +109
-8
lines changed Original file line number Diff line number Diff line change @@ -14,9 +14,37 @@ Java虚拟机特点:
14
14
15
15
- 自动内存管理
16
16
17
- - 自动垃圾回收功能
17
+ - 自动垃圾回收功能r
18
18
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内存区域划分
20
48
21
49
** JVM内存区域划分 ---- 6大区域**
22
50
Original file line number Diff line number Diff line change 1
-
1
+
2
2
3
3
[ TOC]
4
4
18
18
19
19
** a. 引用计数法(Python,C++)**
20
20
21
- - == 给每个对象附加一个引用计数器== ,每当有引用指向当前对象时,计数器 +1;每当有引用不再指向当前对象时,计数器 -1
22
- - 任意时刻,引用计数器值为0的对象,被标记为 == "不在存活"==
21
+ - 给每个对象附加一个引用计数器,每当有引用指向当前对象时,计数器 +1;每当有引用不再指向当前对象时,计数器 -1
22
+ - 任意时刻,引用计数器值为0的对象,被标记为"不在存活"
23
23
- 缺点 :无法解决循环引用问题(我中有你,你中有我)
24
24
25
25
** b. 可达性分析算法(Java,C#)**
Original file line number Diff line number Diff line change @@ -18,7 +18,24 @@ JVM的主要任务是负责装载字节码到其内部,但字节码并不能
18
18
19
19
简单来说,JVM中的执行引擎充当了将高级语言翻译为机器语言的翻译官。
20
20
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. 执行引擎工作过程
22
39
23
40
![ ] ( https://iqqcode-blog.oss-cn-beijing.aliyuncs.com/img/20200707091130.png )
24
41
@@ -30,7 +47,7 @@ JVM的主要任务是负责装载字节码到其内部,但字节码并不能
30
47
31
48
-----------------------------------------------
32
49
33
- ## 3 . 前端编译器与后端编译器
50
+ ## 4 . 前端编译器与后端编译器
34
51
35
52
> 👉参考文章【[ Java编译分类:前端编译和后端编译是如何划分的] ( https://blog.csdn.net/yu870646595/article/details/78987805 ) 】
36
53
@@ -88,7 +105,7 @@ JVM的主要任务是负责装载字节码到其内部,但字节码并不能
88
105
89
106
--------------
90
107
91
- ## 4 . Java程序的编译与执行
108
+ ## 5 . Java程序的编译与执行
92
109
93
110
![ ] ( https://iqqcode-blog.oss-cn-beijing.aliyuncs.com/img/20200707093416.png )
94
111
Original file line number Diff line number Diff line change
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 )
You can’t perform that action at this time.
0 commit comments