Skip to content

Commit 1741a67

Browse files
committed
Update [加餐]大白话带你认识JVM.md
1 parent 4baeecd commit 1741a67

File tree

1 file changed

+5
-5
lines changed

1 file changed

+5
-5
lines changed

docs/java/jvm/[加餐]大白话带你认识JVM.md

+5-5
Original file line numberDiff line numberDiff line change
@@ -95,7 +95,7 @@ JVM 是 Java Virtual Machine 的缩写,它是一个虚构出来的计算机,
9595

9696
#### 2.1.3 初始化
9797

98-
初始化其实就是执行类构造器方法的`<clinit>()`的过程,而且要保证执行前父类的`<clinit>()`方法执行完毕。这个方法由编译器收集,顺序执行所有类变量(static修饰的成员变量)显式初始化和静态代码块中语句。此时准备阶段时的那个 `static int a` 由默认初始化的0变成了显式初始化的3. 由于执行顺序缘故,初始化阶段类变量如果在静态代码块中又进行了更改,会覆盖类变量的显式初始化,最终值会为静态代码块中的赋值。
98+
初始化其实就是执行类构造器方法的`<clinit>()`的过程,而且要保证执行前父类的`<clinit>()`方法执行完毕。这个方法由编译器收集,顺序执行所有类变量(static修饰的成员变量)显式初始化和静态代码块中语句。此时准备阶段时的那个 `static int a` 由默认初始化的0变成了显式初始化的3 由于执行顺序缘故,初始化阶段类变量如果在静态代码块中又进行了更改,会覆盖类变量的显式初始化,最终值会为静态代码块中的赋值。
9999
>注意:字节码文件中初始化方法有两种,非静态资源初始化的`<init>`和静态资源初始化的`<clinit>`,类构造器方法`<clinit>()`不同于类的构造器,这些方法都是字节码文件中只能给JVM识别的特殊方法。
100100
101101
#### 2.1.4 卸载
@@ -113,11 +113,11 @@ GC将无用对象从内存中卸载
113113

114114
### 2.3 双亲委派机制
115115

116-
当一个类收到了加载请求时,它是不会先自己去尝试加载的,而是委派给父类去完成,比如我现在要new一个Person,这个Person是我们自定义的类,如果我们要加载它,就会先委派App ClassLoader,只有当父类加载器都反馈自己无法完成这个请求(也就是父类加载器都没有找到加载所需的Class)时,子类加载器才会自行尝试加载。
116+
当一个类收到了加载请求时,它是不会先自己去尝试加载的,而是委派给父类去完成,比如我现在要 new 一个 Person,这个 Person 是我们自定义的类,如果我们要加载它,就会先委派 App ClassLoader ,只有当父类加载器都反馈自己无法完成这个请求(也就是父类加载器都没有找到加载所需的 Class)时,子类加载器才会自行尝试加载。
117117

118-
这样做的好处是,加载位于rt.jar包中的类时不管是哪个加载器加载,最终都会委托到BootStrap ClassLoader进行加载,这样保证了使用不同的类加载器得到的都是同一个结果。
118+
这样做的好处是,加载位于 rt.jar 包中的类时不管是哪个加载器加载,最终都会委托到 BootStrap ClassLoader 进行加载,这样保证了使用不同的类加载器得到的都是同一个结果。
119119

120-
其实这个也是一个隔离的作用,避免了我们的代码影响了JDK的代码,比如我现在自己定义一个 `java.lang.String`
120+
其实这个也是一个隔离的作用,避免了我们的代码影响了 JDK 的代码,比如我现在自己定义一个 `java.lang.String`
121121

122122
```java
123123
package java.lang;
@@ -128,7 +128,7 @@ public class String {
128128
}
129129
```
130130

131-
尝试运行当前类的 `main` 函数的时候,我们的代码肯定会报错。这是因为在加载的时候其实是找到了 rt.jar 中的`java.lang.String`,然而发现这个里面并没有 main 方法。
131+
尝试运行当前类的 `main` 函数的时候,我们的代码肯定会报错。这是因为在加载的时候其实是找到了 rt.jar 中的`java.lang.String`,然而发现这个里面并没有 `main` 方法。
132132

133133
## 三、运行时数据区
134134

0 commit comments

Comments
 (0)