From 1741a6798ecd65449744d899f429f73a98efab0d Mon Sep 17 00:00:00 2001 From: kaka2634 <996529090@qq.com> Date: Fri, 27 Aug 2021 23:29:43 +0800 Subject: [PATCH] =?UTF-8?q?Update=20[=E5=8A=A0=E9=A4=90]=E5=A4=A7=E7=99=BD?= =?UTF-8?q?=E8=AF=9D=E5=B8=A6=E4=BD=A0=E8=AE=A4=E8=AF=86JVM.md?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- docs/java/jvm/[加餐]大白话带你认识JVM.md | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/docs/java/jvm/[加餐]大白话带你认识JVM.md b/docs/java/jvm/[加餐]大白话带你认识JVM.md index 786d33ef..f1e16f87 100644 --- a/docs/java/jvm/[加餐]大白话带你认识JVM.md +++ b/docs/java/jvm/[加餐]大白话带你认识JVM.md @@ -95,7 +95,7 @@ JVM 是 Java Virtual Machine 的缩写,它是一个虚构出来的计算机, #### 2.1.3 初始化 -初始化其实就是执行类构造器方法的`()`的过程,而且要保证执行前父类的`()`方法执行完毕。这个方法由编译器收集,顺序执行所有类变量(static修饰的成员变量)显式初始化和静态代码块中语句。此时准备阶段时的那个 `static int a` 由默认初始化的0变成了显式初始化的3. 由于执行顺序缘故,初始化阶段类变量如果在静态代码块中又进行了更改,会覆盖类变量的显式初始化,最终值会为静态代码块中的赋值。 +初始化其实就是执行类构造器方法的`()`的过程,而且要保证执行前父类的`()`方法执行完毕。这个方法由编译器收集,顺序执行所有类变量(static修饰的成员变量)显式初始化和静态代码块中语句。此时准备阶段时的那个 `static int a` 由默认初始化的0变成了显式初始化的3。 由于执行顺序缘故,初始化阶段类变量如果在静态代码块中又进行了更改,会覆盖类变量的显式初始化,最终值会为静态代码块中的赋值。 >注意:字节码文件中初始化方法有两种,非静态资源初始化的``和静态资源初始化的``,类构造器方法`()`不同于类的构造器,这些方法都是字节码文件中只能给JVM识别的特殊方法。 #### 2.1.4 卸载 @@ -113,11 +113,11 @@ GC将无用对象从内存中卸载 ### 2.3 双亲委派机制 -当一个类收到了加载请求时,它是不会先自己去尝试加载的,而是委派给父类去完成,比如我现在要new一个Person,这个Person是我们自定义的类,如果我们要加载它,就会先委派App ClassLoader,只有当父类加载器都反馈自己无法完成这个请求(也就是父类加载器都没有找到加载所需的Class)时,子类加载器才会自行尝试加载。 +当一个类收到了加载请求时,它是不会先自己去尝试加载的,而是委派给父类去完成,比如我现在要 new 一个 Person,这个 Person 是我们自定义的类,如果我们要加载它,就会先委派 App ClassLoader ,只有当父类加载器都反馈自己无法完成这个请求(也就是父类加载器都没有找到加载所需的 Class)时,子类加载器才会自行尝试加载。 -这样做的好处是,加载位于rt.jar包中的类时不管是哪个加载器加载,最终都会委托到BootStrap ClassLoader进行加载,这样保证了使用不同的类加载器得到的都是同一个结果。 +这样做的好处是,加载位于 rt.jar 包中的类时不管是哪个加载器加载,最终都会委托到 BootStrap ClassLoader 进行加载,这样保证了使用不同的类加载器得到的都是同一个结果。 -其实这个也是一个隔离的作用,避免了我们的代码影响了JDK的代码,比如我现在自己定义一个 `java.lang.String` : +其实这个也是一个隔离的作用,避免了我们的代码影响了 JDK 的代码,比如我现在自己定义一个 `java.lang.String` : ```java package java.lang; @@ -128,7 +128,7 @@ public class String { } ``` -尝试运行当前类的 `main` 函数的时候,我们的代码肯定会报错。这是因为在加载的时候其实是找到了 rt.jar 中的`java.lang.String`,然而发现这个里面并没有 main 方法。 +尝试运行当前类的 `main` 函数的时候,我们的代码肯定会报错。这是因为在加载的时候其实是找到了 rt.jar 中的`java.lang.String`,然而发现这个里面并没有 `main` 方法。 ## 三、运行时数据区