1
0
mirror of https://github.com/Snailclimb/JavaGuide synced 2025-06-16 18:10:13 +08:00

[docs improve]完善JVM部分Java虚拟机栈的介绍

This commit is contained in:
guide 2022-03-31 19:43:24 +08:00
parent 52ffb2c2dd
commit 81a4ee5ea3
14 changed files with 54 additions and 48 deletions

View File

@ -173,7 +173,7 @@ public class DebugInvocationHandler implements InvocationHandler {
## 注解 ## 注解
`Annontation` (注解) 是Java5 开始引入的新特性,可以看作是一种特殊的注释,主要用于修饰类、方法或者变量。 `Annotation` (注解) 是Java5 开始引入的新特性,可以看作是一种特殊的注释,主要用于修饰类、方法或者变量。
注解本质是一个继承了`Annotation` 的特殊接口: 注解本质是一个继承了`Annotation` 的特殊接口:

View File

@ -60,37 +60,37 @@ Java 虚拟机规范对于运行时数据区域的规定是相当宽松的。以
### Java 虚拟机栈 ### Java 虚拟机栈
与程序计数器一样Java 虚拟机栈也是线程私有的,它的生命周期和线程相同,描述的是 Java 方法执行的内存模型,每次方法调用的数据都是通过栈传递的 与程序计数器一样Java 虚拟机栈(后文简称栈)也是线程私有的,它的生命周期和线程相同,随着线程的创建而创建,随着线程的死亡而死亡
Java 内存可以粗糙的区分为: 栈绝对算的上是 JVM 运行时数据区域的一个核心,除了一些 Native 方法调用是通过本地方法栈实现的(后面会提到),其他所有的 Java 方法调用都是通过栈来实现的(也需要和其他运行时数据区域比如程序计数器配合)。
- 堆内存Heap 方法调用的数据需要通过栈进行传递,每一次方法调用都会有一个对应的栈帧被压入栈中,每一个方法调用结束后,都会有一个栈帧被弹出。
- 栈内存 (Stack)
栈也就是 Java 虚拟机栈,由一个个栈帧组成,而每个栈帧中都拥有:局部变量表、操作数栈、动态链接、方法出口信息。 栈由一个个栈帧组成,而每个栈帧中都拥有:局部变量表、操作数栈、动态链接、方法返回地址。和数据结构上的栈类似,两者都是先进后出的数据结构,只支持出栈和入栈两种操作。
![](pictures/java内存区域/stack.png)
**局部变量表** 主要存放了编译期可知的各种数据类型boolean、byte、char、short、int、float、long、double、对象引用reference 类型,它不同于对象本身,可能是一个指向对象起始地址的引用指针,也可能是指向一个代表对象的句柄或其他与此对象相关的位置)。 **局部变量表** 主要存放了编译期可知的各种数据类型boolean、byte、char、short、int、float、long、double、对象引用reference 类型,它不同于对象本身,可能是一个指向对象起始地址的引用指针,也可能是指向一个代表对象的句柄或其他与此对象相关的位置)。
Java 虚拟机栈会出现两种错误: **操作数栈** 主要作为方法调用的中转站使用,用于存放方法执行过程中产生的中间计算结果。另外,计算过程中产生的临时变量也会放在操作数栈中。
- **`StackOverFlowError`** 若 Java 虚拟机栈的内存大小不允许动态扩展,那么当线程请求栈的深度超过当前 Java 虚拟机栈的最大深度的时候,就抛出 StackOverFlowError 错误。 **动态链接** 主要服务一个方法需要调用其他方法的场景。在 Java 源文件被编译成字节码文件时所有的变量和方法引用都作为符号引用Symbilic Reference保存在Class 文件的常量池里。当一个方法要调用其他方法,需要将常量池中指向方法的符号引用转化为其在内存地址中的直接引用。动态链接的作用就是为了将符号引用转换为调用方法的直接引用。
- **`OutOfMemoryError`** Java 虚拟机栈的内存大小可以动态扩展, 如果虚拟机在动态扩展栈时无法申请到足够的内存空间,则抛出`OutOfMemoryError`异常。
![](https://guide-blog-images.oss-cn-shenzhen.aliyuncs.com/github/javaguide/jvmimage-20220331175738692.png)
栈空间虽然不是无限的,但一般正常调用的情况下是不会出现问题的。不过,如果函数调用陷入无限循环的话,就会导致栈中被压入太多栈帧而占用太多空间,导致栈空间过深。那么当线程请求栈的深度超过当前 Java 虚拟机栈的最大深度的时候,就抛出 `StackOverFlowError` 错误。
Java 方法有两种返回方式,一种是 return 语句正常返回,一种是抛出异常。不管哪种返回方式,都会导致栈帧被弹出。也就是说, **栈帧随着方法调用而创建,随着方法结束而销毁。无论方法正常完成还是异常完成都算作方法结束。**
除了 `StackOverFlowError` 错误之外,栈还可能会出现`OutOfMemoryError`错误,这是因为如果栈的内存大小可以动态扩展, 如果虚拟机在动态扩展栈时无法申请到足够的内存空间,则抛出`OutOfMemoryError`异常。
简单总结一下程序运行中栈可能会出现两种错误:
- **`StackOverFlowError`** 若栈的内存大小不允许动态扩展,那么当线程请求栈的深度超过当前 Java 虚拟机栈的最大深度的时候,就抛出 `StackOverFlowError` 错误。
- **`OutOfMemoryError`** 如果栈的内存大小可以动态扩展, 如果虚拟机在动态扩展栈时无法申请到足够的内存空间,则抛出`OutOfMemoryError`异常。
![](./pictures/java内存区域/《深入理解虚拟机》第三版的第2章-虚拟机栈.png) ![](./pictures/java内存区域/《深入理解虚拟机》第三版的第2章-虚拟机栈.png)
Java 虚拟机栈也是线程私有的,每个线程都有各自的 Java 虚拟机栈,而且随着线程的创建而创建,随着线程的死亡而死亡。
🌈 拓展一下: **方法/函数如何调用?**
Java 栈可以类比数据结构中栈Java 栈中保存的主要内容是栈帧,每一次函数调用都会有一个对应的栈帧被压入 Java 栈,每一个函数调用结束后,都会有一个栈帧被弹出。
Java 方法有两种返回方式:
1. return 语句。
2. 抛出异常。
不管哪种返回方式都会导致栈帧被弹出。
### 本地方法栈 ### 本地方法栈
和虚拟机栈所发挥的作用非常相似,区别是: **虚拟机栈为虚拟机执行 Java 方法 (也就是字节码)服务,而本地方法栈则为虚拟机使用到的 Native 方法服务。** 在 HotSpot 虚拟机中和 Java 虚拟机栈合二为一。 和虚拟机栈所发挥的作用非常相似,区别是: **虚拟机栈为虚拟机执行 Java 方法 (也就是字节码)服务,而本地方法栈则为虚拟机使用到的 Native 方法服务。** 在 HotSpot 虚拟机中和 Java 虚拟机栈合二为一。
@ -149,19 +149,33 @@ Java 堆是垃圾收集器管理的主要区域,因此也被称作 **GC 堆(
### 方法区 ### 方法区
方法区与 Java 堆一样,是各个线程共享的内存区域,它用于存储已被虚拟机加载的**类信息、字段信息、方法信息、常量、静态变量、即时编译器编译后的代码缓存等数据**。虽然 Java 虚拟机规范把方法区描述为堆的一个逻辑部分,但是它却有一个别名叫做 **Non-Heap非堆**,目的应该是与 Java 堆区分开来 方法区属于是 JVM 运行时数据区域的一块逻辑区域,是各个线程共享的内存区域
#### 方法区和永久代以及元空间的关系 《Java 虚拟机规范》只是规定了有方法区这么个概念和它的作用,方法区到底要如何实现那就是虚拟机自己要考虑的事情了。也就是说,在不同的虚拟机实现上,方法区的实现是不同的。
《Java 虚拟机规范》只是规定了有方法区这么个概念和它的作用,并没有规定如何去实现它。因此,在不同的虚拟机实现上,方法区的实现是不同的 当虚拟机要使用一个类时,它需要读取并解析 Class 文件获取相关信息,再将信息存入到方法区。方法区会存储已被虚拟机加载的 **类信息、字段信息、方法信息、常量、静态变量、即时编译器编译后的代码缓存等数据**
方法区和永久代以及元空间的关系很像 Java 中接口和类的关系,类实现了接口,这里的类就可以看作是永久代和元空间,接口可以看作是方法区,也就是说永久代以及元空间是 HotSpot 虚拟机对虚拟机规范中方法区的两种实现方式。 **方法区和永久代以及元空间是什么关系呢?** 方法区和永久代以及元空间的关系很像 Java 中接口和类的关系,类实现了接口,这里的类就可以看作是永久代和元空间,接口可以看作是方法区,也就是说永久代以及元空间是 HotSpot 虚拟机对虚拟机规范中方法区的两种实现方式。并且,永久代是 JDK 1.8 之前的方法区实现JDK 1.8 及以后方法区的实现便成为元空间。
并且,永久代是 JDK 1.8 之前的方法区实现JDK 1.8 及以后方法区的实现便成为元空间。
![HotSpot 虚拟机方法区的两种实现](./pictures/java内存区域/method-area-implementation.png) ![HotSpot 虚拟机方法区的两种实现](./pictures/java内存区域/method-area-implementation.png)
#### 方法区常用参数 **为什么要将永久代 (PermGen) 替换为元空间 (MetaSpace) 呢?**
下图来自《深入理解 Java 虚拟机》第 3 版 2.2.5
![](https://img-blog.csdnimg.cn/20210425134508117.png)
1、整个永久代有一个 JVM 本身设置的固定大小上限,无法进行调整,而元空间使用的是直接内存,受本机可用内存的限制,虽然元空间仍旧可能溢出,但是比原来出现的几率会更小。
> 当元空间溢出时会得到如下错误: `java.lang.OutOfMemoryError: MetaSpace`
你可以使用 `-XXMaxMetaspaceSize` 标志设置最大元空间大小,默认值为 unlimited这意味着它只受系统内存的限制。`-XXMetaspaceSize` 调整标志定义元空间的初始大小如果未指定此标志,则 Metaspace 将根据运行时的应用程序需求动态地重新调整大小。
2、元空间里面存放的是类的元数据这样加载多少类的元数据就不由 `MaxPermSize` 控制了, 而由系统的实际可用空间来控制,这样能加载的类就更多了。
3、在 JDK8合并 HotSpot 和 JRockit 的代码时, JRockit 从来没有一个叫永久代的东西, 合并之后就没有必要额外的设置这么一个永久代的地方了。
**方法区常用参数有哪些?**
JDK 1.8 之前永久代还没被彻底移除的时候通常通过下面这些参数来调节方法区大小。 JDK 1.8 之前永久代还没被彻底移除的时候通常通过下面这些参数来调节方法区大小。
@ -181,23 +195,7 @@ JDK 1.8 的时候方法区HotSpot 的永久代被彻底移除了JDK1
与永久代很大的不同就是,如果不指定大小的话,随着更多类的创建,虚拟机会耗尽所有可用的系统内存。 与永久代很大的不同就是,如果不指定大小的话,随着更多类的创建,虚拟机会耗尽所有可用的系统内存。
#### 为什么要将永久代 (PermGen) 替换为元空间 (MetaSpace) 呢? 最后,我画了 3 张图带你看看 JDK1.6 到 JDK1.8 方法区的变化。
下图来自《深入理解 Java 虚拟机》第 3 版 2.2.5
![](https://img-blog.csdnimg.cn/20210425134508117.png)
1、整个永久代有一个 JVM 本身设置的固定大小上限,无法进行调整,而元空间使用的是直接内存,受本机可用内存的限制,虽然元空间仍旧可能溢出,但是比原来出现的几率会更小。
> 当元空间溢出时会得到如下错误: `java.lang.OutOfMemoryError: MetaSpace`
你可以使用 `-XXMaxMetaspaceSize` 标志设置最大元空间大小,默认值为 unlimited这意味着它只受系统内存的限制。`-XXMetaspaceSize` 调整标志定义元空间的初始大小如果未指定此标志,则 Metaspace 将根据运行时的应用程序需求动态地重新调整大小。
2、元空间里面存放的是类的元数据这样加载多少类的元数据就不由 `MaxPermSize` 控制了, 而由系统的实际可用空间来控制,这样能加载的类就更多了。
3、在 JDK8合并 HotSpot 和 JRockit 的代码时, JRockit 从来没有一个叫永久代的东西, 合并之后就没有必要额外的设置这么一个永久代的地方了。
#### 图解 JDK1.6~JDK1.8 方法区的变化
![方法区-jdk1.6](./pictures/java内存区域/method-area-1.6.png) ![方法区-jdk1.6](./pictures/java内存区域/method-area-1.6.png)
@ -205,6 +203,12 @@ JDK 1.8 的时候方法区HotSpot 的永久代被彻底移除了JDK1
![方法区-jdk1.8](./pictures/java内存区域/method-area-jdk1.8.png) ![方法区-jdk1.8](./pictures/java内存区域/method-area-jdk1.8.png)
多提一嘴为了完善方法区这部分内容的介绍我看了很多文档还特意去扒了一下《深入理解Java虚拟机第3版》勘误的 issues简直看到的脑壳疼。。。
![](https://guide-blog-images.oss-cn-shenzhen.aliyuncs.com/github/javaguide/jvmimage-20220331112415166.png)
讲真,深挖下来的话细节太多,也没太大意义(卷不动了),我上面讲到的这些基本就够面试使用了。
### 运行时常量池 ### 运行时常量池
Class 文件中除了有类的版本、字段、方法、接口等描述信息外还有用于存放编译期生成的各种字面量Literal和符号引用Symbolic Reference的常量池表(Constant Pool Table)。常量池表会在类加载后存放到方法区的运行时常量池中。 Class 文件中除了有类的版本、字段、方法、接口等描述信息外还有用于存放编译期生成的各种字面量Literal和符号引用Symbolic Reference的常量池表(Constant Pool Table)。常量池表会在类加载后存放到方法区的运行时常量池中。
@ -332,6 +336,7 @@ Java 对象的创建过程我建议最好是能默写出来,并且要掌握每
- 《深入理解 Java 虚拟机JVM 高级特性与最佳实践(第二版》 - 《深入理解 Java 虚拟机JVM 高级特性与最佳实践(第二版》
- 《自己动手写 Java 虚拟机》 - 《自己动手写 Java 虚拟机》
- Chapter 2. The Structure of the Java Virtual Machinehttps://docs.oracle.com/javase/specs/jvms/se8/html/jvms-2.html - Chapter 2. The Structure of the Java Virtual Machinehttps://docs.oracle.com/javase/specs/jvms/se8/html/jvms-2.html
- JVM栈帧内部结构-动态链接https://chenxitag.com/archives/368
- <http://www.pointsoftware.ch/en/under-the-hood-runtime-data-areas-javas-memory-model/> - <http://www.pointsoftware.ch/en/under-the-hood-runtime-data-areas-javas-memory-model/>
- <https://dzone.com/articles/jvm-permgen-%E2%80%93-where-art-thou> - <https://dzone.com/articles/jvm-permgen-%E2%80%93-where-art-thou>
- <https://stackoverflow.com/questions/9095748/method-area-and-permgen> - <https://stackoverflow.com/questions/9095748/method-area-and-permgen>

Binary file not shown.

Before

Width:  |  Height:  |  Size: 52 KiB

After

Width:  |  Height:  |  Size: 50 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 89 KiB

After

Width:  |  Height:  |  Size: 72 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 121 KiB

After

Width:  |  Height:  |  Size: 87 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 25 KiB

After

Width:  |  Height:  |  Size: 20 KiB

View File

@ -1 +1 @@
<mxfile host="Electron" modified="2022-03-30T07:21:43.325Z" agent="5.0 (Macintosh; Intel Mac OS X 10_16_0) AppleWebKit/537.36 (KHTML, like Gecko) draw.io/13.4.5 Chrome/83.0.4103.122 Electron/9.1.0 Safari/537.36" etag="RlzXn4cK5pUmxmESu9hE" version="13.4.5" type="device"><diagram id="2YC4MhdPOoUwFEyv9jkW" name="Page-1">7VrbbuM2EP0aAt0HLyRRlMRHyZd0Uyyw6HZR9KmgJcoWIkuurMTJfn05FHVn6gS1BWc3TgDTM7x5zpzhcGSE57vHm4Ltt5/ziKfIMqJHhBfIskyKsXgDyVMlodStBJsiiVSnVvA1+c6V0FDS+yTih17HMs/TMtn3hWGeZTwsezJWFPmx3y3O0/6qe7bhI8HXkKVj6Z9JVG4rqWe5rfxXnmy29cqmQyvNjtWd1Tc5bFmUHzsivER4XuR5WbV2j3OegvFqu1TjVs9om40VPCtfMuCvYGd84zdffv/b//R5Q5aLOKQzy6mmeWDpvfrGarflU22CIr/PIg6zmAgHx21S8q97FoL2KEAXsm25S5U6TtJ0nqd5IcfimMCfkB/KIr/jHY0jX6C542W4rYfnWamcQHyd6nNnUPUScrVrXpT88Vl7mI2VhXvyfMfL4kl0UZ7YuNixxZU4SrbtYNoImfKlTTNXa27RUBZ/jfXdsfWXDqIOCig0AowoQUuCvDkKfLRcoWCOPE+qDBSIhg09PSIbAfLxF17sbngGY/wloku0dJG3hN5qMB3BKyxY9jHsY5XlGR8Aq0QsTTaZ+BgKi3MhDwCPRHDHV4pdEkWwjNZpWrcyBsCT/wmwGjAzxUxyTI24PUbcMzWIWxcD3BsBfvvpjwY9QMs3kGdCQ6BFsQRygah3XlbGsRWGOlZGztohJ1l5BnBqsytoiEdG0FhEA413MWjoZSMhNyPCXZ3NqeNiNoXNrb7NLTqmg9bm1sUCIDY0AVC4vgl8gLgn/rGkxwr5JsQ9wQ1/9QZimHUeyPoBDGuOrIYRkwQwbP4XYCdx+tFSCTXA6RMLkzFMpo5Y9sVgsjQwVSeJC+iI3CAg73gpvGwNrSbGC78oEXzHq4KBjpOFifGyR3h9lK83cjJt8yL5LmQsVR3OkdENUjrbGbPKnvSsIhpSeYhSRH1JoQDRlaRZdbsSuYYj71LPpdzXieU5EsMBdK4uIGJnSux+wrpEHewG0a4xcjfpcyetU2BdnULQaAFkAiZVd1ZBoBXwRqg8F9pnRcwLuf7OuvaITYwJ7k+ucTrPswwNMu7FgBnXE2T4MiCUXX/4OlOhZ8QYHS7TXpN0xQQnBfMf9izr4eL8cw8l4CCsbO4LZbFZ/0LEdxbbE+sbveaHdoRobeR7m9q7yJ8j35GpoocC6Q3Q6JAS0kkTXERtSHzBak9qsnOSNmLci7WkdUKPr+MJSOvQ/h2aYE2laVLS1knQgLQi8xDYAXBzCaWMpoGrCrfUv2UP7AaehtTArQutH4ENZwdpRPAl09k/Vr4y8hqx1AKSH5EUQQQnzVLVMmIHFCOfXGkgSdmapwEL7zZSPly89STTGR/YgfyTc5asTHJYG6pRA388g//hQW7laIrQpi44mRfzP10N5z0v1h349QOaq8mLbU1h5wcL2Fb9jOp6ytS2pjzTO87bc1gwJ/AVeSCcO1C4gcdvgkILqLt1y9t0CWSb4By+4usOxqeT6mmLO/a4uNNJrJpjmcizkoCK2sg/8xO6twOYrs4zMWDjQs9PX43D3gAlTRVh0mqcravoVJFPLMCEJtyy4sDLXjJ7X8YzT5O7vvIypW5P9dsHOYUhM+WY7ZL0qeq65ekDB1Q7+jaTtojKpJWiWhQ0WV7sALxGd1QWBaVtVJAaKS+F68zEnsMk24xHgnPOlJ+BrnG1WpcIH8rUrEa9F6kpC5YdYjFXPav0WUA7L6L+is3AdZM6zwbWsmyvMpRlU9Ugtc2i5LBPmbJXkqVJvVKc5qwcLD+E7Xbxm/nReemBp8h6InCeI+NwcI8rnqGJaLrfieCLkUVTcHu9y7de3zq+ytLGvi8mYru9VGJsg40bMgw1/UkGBOnrRhzpqYc0sU4zpe7yDFl66iFfekodZeoOetbU2hPEMTrcMTr0qYfrGNRYZUAiPYPcq2OQPThtTKy7KJ2HQeJj+6NJqev89BQv/wU=</diagram></mxfile> <mxfile host="Electron" modified="2022-03-31T03:28:42.359Z" agent="5.0 (Macintosh; Intel Mac OS X 10_16_0) AppleWebKit/537.36 (KHTML, like Gecko) draw.io/13.4.5 Chrome/83.0.4103.122 Electron/9.1.0 Safari/537.36" etag="QzftLCDC_3xCinoJ3sk4" version="13.4.5" type="device"><diagram id="2YC4MhdPOoUwFEyv9jkW" name="Page-1">7Vptb6M4EP41lm4/ZAUYA/4ICeltTyutrrc63aeTA06CSiBHaNPurz+PMe/eS6tLULrbtFKdGb8xzzzj8VCE57unm4Ltt5/zmKfIMuInhBfIskyKsfgDkudKQqlbCTZFEqtOreAu+caV0FDShyTmh17HMs/TMtn3hVGeZTwqezJWFPmx322dp/1V92zDR4K7iKVj6Z9JXG4rqWe5rfxXnmy29cqmQyvNjtWd1ZMctizOjx0RDhGeF3leVq3d05ynYLzaLtW45Xe0zcYKnpUvGfBXsDO+8psvv//tf/q8IeFiHdGZ5VTTPLL0QT2x2m35XJugyB+ymMMsJsLBcZuU/G7PItAeBehCti13qVKvkzSd52leyLF4TeBHyA9lkd/zjsaRH9Dc8zLa1sPzrFROIB6n+t4ZVH2EfPzwyh6PvCj5U0ekjHHD8x0vi2fRRXli42LHFlfiKNm2g2kjZMqXNs1crblFQ1n8NdZ3x9YPHUQdFFBoBBhRgkKCvDkKfBQuUTBHnidVBgpEw4aeHpGNAPn4Cy92NzyDMX6IaIhCF3kh9FaD6QheYa6yj2EfqyzP+ABYJWJpssnE10iAwIU8AOMngju+UuySOIZltE7TupUxAJ78T4CVdmaKmeSYGnF7jLhnahC3Lga4NwL89tMfDXqAlm8gz4SGQItiCeQCUe+8rFyvrSjSsTJ2Vg45ycozgFObXUFDPDKCxiIaaLyLQUMvGwm5GRPu6mxOHRezKWxu9W1u0TEdtDa3LhYAsaEJgML1TeADxD3xiyU9lsg3Ie4JbvjLNxDDrPNA1g9gWHNkNYyYJIBh878AO4nTj5ZKKK3TJxYmY5hMHbHsi8FkaWCqThIX0BG5QUDe8VJ42RpaTYwXflEi+I5XBQMdJwsT42WP8PooP2/kZNrmRfJNyFiqOpwjoxukdLYzZpU96VlFNKTyEKWI+pJCAaJLSbPqdiVyDUfepb6Xcl8nludIDAfQubqAiJ0psfsJ6xJ1sBtEu8bI3aTPnbROgXV1CkGjBZAJmFTdWQWBlsAbofJcaJ8VMS/i+jvryiM2MSa4P7nG6TzPMjTIuBcDZlxPkOHLgFB2/eHrTIWeEWN0uEx7TdIVE5wUzH/Ys6yHi/PPA5SAg6iyuS+UxWb1CxHPLLYn1jd6zQ/tCNHayL9tau8if458R6aKHgqkN0CjQ0pIJ01wEbUh8YDVntRk5yRtzLi31pLWiTy+Wk9AWof279AEaypNk5K2ToIGpBWZh8AOgJtLKGU0DVxVuKX+LXtkN/A2pAZuVWj9CGw4O0gjgi+Zzv6p8pWR14ilFpD8iKQIIjhplqqWETugGPnkSgNJylY8DVh0v5Hy4eKtJ5nO+MAO5I+cs2RlksPaUI0a+OMZ/A8PcitHU4Q2dcHJvJj/6Wo473mx7sCvX9BcTV5sawo7P1jAtup3VNdTprY15Znecd6ew4I5ga/IA+HcgcINvH4TFFpA3a1b3qYhkG2Cc/iKrzsYn06qpy3u2OPiTiexao5lIs9KAipqI//Mb+jeDmC6Os/EgI0LPT99NQ57A5Q0VYRJq3G2pobwyiuR0VyDOq0PSB08hkx812yXpM/VGDER2+2lEmMbDM3TRw6ojTT9Sdrs2SIie+7rql2CMsuLHUv76qOyJejtap9SmfJS+M1MPGqUZBvteHDOmfIzUCtX66kT4UaZmt7obE0qy4Jlh7WYtJ5eeG7d4ZgXcX/17vBVk0bPBja3bK+xtWXTtk06lo+Twz5lyupJliadhddpzsruhob3kNvFb+ZH96WnoGLwiWh6BgLZAwKZWJf7aRiEX88g8bX9PzCp6/w3HQ7/BQ==</diagram></mxfile>

Binary file not shown.

Before

Width:  |  Height:  |  Size: 202 KiB

After

Width:  |  Height:  |  Size: 214 KiB

View File

@ -1 +1 @@
<mxfile host="Electron" modified="2022-03-30T07:21:11.404Z" agent="5.0 (Macintosh; Intel Mac OS X 10_16_0) AppleWebKit/537.36 (KHTML, like Gecko) draw.io/13.4.5 Chrome/83.0.4103.122 Electron/9.1.0 Safari/537.36" etag="Qa2XfhKtkmi8ayWUAy3h" version="13.4.5" type="device"><diagram id="gYNeldG73rc2GvLzjtzR" name="Page-1">7Vrbkps4EP0aVW0enAKEBHoEj53NbOVptmq39k0GYZPB4GDmlq9ftRCYi2adVDDl2cQzVZa7dXOfPq1WY4SX++cPJT/sPhWxyJBjxc8I3yDHsRnG8g0kL7WEMa8WbMs01p1Ogrv0q9BCS0sf0lgcex2rosiq9NAXRkWei6jqyXhZFk/9bkmR9Vc98K0YCe4ino2lf6VxtaulvuOd5L+LdLtrVrYpqzV73nTW3+S443Hx1BHhFcLLsiiqurV/XooMjNfYpR63fkXbbqwUefUtA6ov6d//HPPtS/bRspPN493nz+uFnuWRZw/6C+vNVi+NBcriIY8FTGIjHD7t0krcHXgE2ieJuZTtqn2m1UmaZcsiK0o1FicE/qT8WJXFvehoqHqB5l5U0a4ZXuSV9gH5berPnUH1S8r1rkVZiedXzWG3RpbeKYq9qMoX2UU7YuthTydYCdWyXQfSVsi1K23buU7Wlg1t8O8wvjM2/ooiRlHIoBFixAhaEeQvURig1RqFS+T7aOWhgCkJQ5JNoftJVLyGRHYOVoitoI+/QqHVjGIjWKXlqj52fYzyIhcDQLWIZ+k2lx8jaWkh5SHgkErKBFqxT+MYljE6y8mdrAHg5AeB1QMWtpxJjWmQdsdI+7YBaedSQJMR0Lcf/0QrF4UhCrAC1EK+DQ0JFsMKxxvE/GnJmCROFJnIGNMNJWfJOAE2jdU1MsQnI2QcYkDGvxQy9LLxT9gxEZ7J5Ix6mM9hcqdvcoeNyWA0uXOxsOcZwp50fBvYANFO/mNFjjUKbAiEkhnB+g0EMGcaxPrRCxvOqZYPs0Qv/7/wOgvT/y190ANon1aYjFGyTbRyL4USM6BUnyIegCPTgpD8gkvD5RpINS9czQbOJH+/8KphYONEYWa8xjel9+r1Rs6lXVGmX6WMZ7rDFNncIJ1z6ZhV7pwnlT1OtBWplihYQjSUDbgSyQSDQprxapZ9nRBOkQwOEPNMcRDTOSG7cAZ+zTFuEORaI3czPW/WioRtys0ZYpIl6lTy62uqJNAaeCNVvgftSRHzI2G+pm584hJrhjuTZ53P7hzLgIx3MWBMSThRZQP6BsLXRKWdEWNMuMx6N7INabdDMzD/8cDzHi70ywPUesOotnkgleV28xuR31luT65v9ZrvTiNka6veTxm9B0daQFWG6KNQeQM0OqSELNIGF9Ebkl+w3pOebErSxlz4iZG0NPLFJpmBtJT1L84EG4pLs5LWMeX4qsAB6Yiran2ejqahp0u1LLjlj/wDPPZogNuURj8CGy6OyojgSzY9PNe+MvIaudQNJD8rX0Vw0i5VLwOZEUYBudJAkvGNyEIe3W+VfLj4yZNsOj6wQ/Wn5qx4lRaw9gKPDpEJ/A8PcitqKDvbpuBkX8z/DE93pAvIo5wF6jQPEVvrBBkeJ/y8ebHXPM+7mryYOpfNi68gYDvNU6krKk2brN49zk/nsGROGHRulxTqNXC7lBS6gXJbt6bNVkC2Gc7hK77uYHxtJVPPNcTHNrFqj2WizkoCKuaiYOKHcm8HMFN5Z2bAxvWdn74Ih/0BSoYqwqxFOM9QQ9CRTy7ApSba8fIoql4y+1Al8KBplLt+52VK356at3dqCktlygnfp9lL3XUnskcBqHb0p0zaITqT1op6UdDkRbkH8Frdk7YoKF2rhtTKRCVdZyH3HKX5djwSnHOh/Qx0ras1ulT6UK5ntZq9KE1V8vyYyLmaWZXPAtpFGfdXbAdu2tR5MbCW4/q1oRyX6QZpbBanx0PGtb3SPEublZKs4NVg+SFstzd/2O/ptx54mqxnAucUGQfFPa74liGimX4Zgi9Glh+vH1htzaDTeod0ljb2fTkR3x+UEmMXbNySYajpTzIgSF834khPPaSJc54pTZdXyNJTD/nSU5oo03Qws6bRniGO1eGO1aFPM9zEoNYqAxKZGeRfHYPcwWljY9NFaRoGyY+nX0cqXec3pnj1Lw==</diagram></mxfile> <mxfile host="Electron" modified="2022-03-31T02:52:11.928Z" agent="5.0 (Macintosh; Intel Mac OS X 10_16_0) AppleWebKit/537.36 (KHTML, like Gecko) draw.io/13.4.5 Chrome/83.0.4103.122 Electron/9.1.0 Safari/537.36" etag="A-nn-0EuAYjRZmWQjJ5A" version="13.4.5" type="device"><diagram id="gYNeldG73rc2GvLzjtzR" name="Page-1">7Vptc5s4EP41mrl+cAcQEugjODjX3PRTbuZu7psMsk2DwcUkTvrrbyXEu3pppzbjXOtkJvKu3thnd/VoCcLL/fNtyQ+7j0UiMuRYyTPCN8hxbIYx/JGSl1rCmFcLtmWa6E6d4D79IrTQ0tLHNBHHQceqKLIqPQyFcZHnIq4GMl6WxWnYbVNkw1UPfCsmgvuYZ1PpX2lS7Wqp73id/HeRbnfNyjZltWbPm876SY47nhSnnghHCC/Loqjq1v55KTJpvMYu9bjVV7TtxkqRV98yoPqc/v3PMd++ZB8se7N+uv/0abXQszzx7FE/sN5s9dJYoCwe80TISWyEw9MurcT9gcdSewLMQbar9plWb9IsWxZZUaqxeEPkD8iPVVk8iJ6Gqo/UPIgq3jXDi7zSPgBPU3/vDao/IJ8+e/MgoqzEc0+kbXErir2oyhfooh2x9bBTByuhWrbrQdoKuXalbTtXZ21oaIN/h/GdqfEjihhFIZONECNGUESQv0RhgKIVCpfI91HkoYApCUMQTaH7UVS8hgQ6BxFikezjRyi0mlFsAiuYqRpiN8QoL3IxAlSLeJZuc/gag/EFyENp9BRCJtCKfZokchmjs3TuZI0AJz8IrNYubJhJjWmQdqdI+7YBaedSQJMJ0Hcf/kSRi8IQBVgBaiHflg0Ai2GF4w1i/nmDcbNx4tgUjAldU/JqMJ4Bm8bqGhnikwkyDjEg418KGXrZ/CfshAjPZHJGPcznMLkzNLnDpsFgNLlzsbTnGdIeOL4to0FmO/jFKjhWKLBlIoTICFZvIIE550FsmL2w4Zxq42GW7OX/F16vwvR/ow9aS4dhhckUJdsUVu6lUGIGlOpTxJPgAC0IyS+4NFyuIajmhavZwCvk7xdeNQxsShRmxmt6U3qvPm/kXNoVZfoFZDzTHc7B5kZ0zqXTqHLnPKnsKdFWQbVEwVJmQ2jIKxEQDCppxldZ9nVCeA4yOELMM+VBTOeE7MIM/Jpz3CjJtUbuMz1v1oqEbeLmDDGIEnUq+fU1FQJoJeMGVL4n22dFzI+F+Zq69olLrBnuTJ71OrtzLAMy3sWAMZFwosoG9A2krzOVdiYRY8Jl1ruRbaDdDs2k+Y8Hng9woZ8fZa03jGubB6Ast+vfCDwzbA/WtwbNd90IaG3V347Re/JIC6hiiD4KlTfIRi8oJYu0pYvoDcED1nvSk50zaBMu/I0xaGnsi/VmhqClbHhxJthQXJo1aB0Tx1cFDklHXFXr83Q2DT1dqmXBHX/it/K1RwPcujT6kbTh4qiMKH3Jpofn2lcmXgNL3UjyE/kqg5N2qXoZyYwwCsiVJpKMr0UW8vhhq+TjxTtPsun0wA7Vj5qz4lVayLUXeHKInMH/8IhbUUPZ2TYlJ/ti/md4uwMuAEc5C9RpHiK20gRZvk74eXmx17zPuxpeTJ3L8uIrSNhO81bqikrTJqv3j/PuHIbICYPe7ZLKeo28XUII3chyW7+mzSIZbDOcw1d83cH42kqmnmvIjy2xao9los5KIlXMRcGZX8q9HcBM5Z2ZAZvWd376Ihz2RygZqgizFuG8H78SWe01qNd6h/TBYyniu+H7NHupx8BEfH9QSoxdaWiRPQmJ2kQznKRjzw4B9jzU1buUyrwo9zwbqk/allLv1vtUykxU4DcLeNQ4zbfG8dI5F9rPpFq72kCdghvlenqrtzWlrEqeHzcwaTM9eG7T4VSUyXD1/vB1S6MXI5s7rt/a2nFZ1yY9yyfp8ZBxbfU0z9Lewpus4FV/Q+N7yN3NH/Z7/1tPQR3Br2TTMwSQOwogG5u4nyGC8PdHEHzt/uFL6Xr/NoejfwE=</diagram></mxfile>

Binary file not shown.

Before

Width:  |  Height:  |  Size: 172 KiB

After

Width:  |  Height:  |  Size: 185 KiB

View File

@ -0,0 +1 @@
<mxfile host="Electron" modified="2022-03-31T10:14:25.868Z" agent="5.0 (Macintosh; Intel Mac OS X 10_16_0) AppleWebKit/537.36 (KHTML, like Gecko) draw.io/13.4.5 Chrome/83.0.4103.122 Electron/9.1.0 Safari/537.36" etag="18fnAv3twwZFJ9hqhQpm" version="13.4.5" type="device"><diagram id="vISw4Omdv4bcsCCqeicN" name="Page-1">3Vhdb5swFP01fuwEOIB5BEI7TdrDFGlTHx1wAMXBGThNul8/2xgIwWm7KWm3kIfY5/oD33OPfQ2A8ebwUONt8ZVlhALHyg4AzoHj2LbliT+JPLdIEPgtkNdlphsNwKL8RTRoaXRXZqQZNeSMUV5ux2DKqoqkfIThumb7cbMVo+NZtzgnE2CRYjpFf5QZL1oUOf6AfyZlXnQz217QWja4a6xX0hQ4Y/sjCCYAxjVjvC1tDjGh0nmdX9p+92es/YvVpOJv6ZB8W39f4Mem2pB6t57R5WL5eKdHecJ0pxesX5Y/dx6o2a7KiBzEBjDaFyUniy1OpXUvOBdYwTdUm1clpTGjrFZ94cqVP4E3vGZrcmTx1CMta8LTouvOKq5jQKymrR91ah/ZqfOlbJRT3DS6rJdDak4OZ/1k994XYUvYhvD6WTTpOiBNmI5YO9D1/cC/07Upjrh3XQ1iHXN5P/ZAiyhoZv6AJThlKfFAaAGEJnSJhfMxJ2PfV6wiJ0RpCNMyr0Q1FY4iAo+kG0shhVAbNmWWyWmMQTCEiXVCpHvK8hVI6veL10hyrsXR7LpKyjBBq9SopBSR5eo1JV3A573vOp/7Bp9bBp9D+1pO914QRuKCCIHQ/w8U4ryHQtBHK8Q3kCU4soF4iyQACIJQsYbuQYAU4styIki0pemiB9OKeKlRTpkfLC3rPeQ0c0cEQcMWZrumc+ZaBCGjmgII0BwkMxDNQRArRLBmnT+Bbo0Xg3Del5fAKBwUKr14Uj7IlnoRTEWJQhIQurfOy6yrfxgvnWBPBeOBKJCFCEqpiP0rEjvaTHIWRCBIVCFWEhKFOeji63apcj98a7NNFx2Pyjyg2eJq5H3v507eyZRj7hrlmVA0cJztYTCKUq7+DflGO654z3Zo3fDGs0HPfWM2eAmOnbNsZuXT4PFjglvsk3rOUtTDo2FezR+7vJCSFX8pK6yJCCe8VANJGrasrLhygxsBdy5H2nHWhtyEN0elkBzzkslBA0uttiapBhq2k36/eCLpBGMxe9aUaJOW4dW0bLoOi/PQBWGs8pQYBL5OJCNRuFdI+AU/4Qf5NamjeVm/Rfa2J2SvYmOi/D4lQuoMdvup2mnk7g5NB/G/cQGheElohNN1rvDTyYfIs73pl5hI/cYReQcnZ8sFwq9Pi18IP9t0j/mLS6eoDt/jlO3oqyZMfgM=</diagram></mxfile>

Binary file not shown.

After

Width:  |  Height:  |  Size: 81 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 30 KiB

After

Width:  |  Height:  |  Size: 30 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 89 KiB

After

Width:  |  Height:  |  Size: 88 KiB