1.JVM运行机制的整体脉络

  1.JAVA代码是怎么运行?

 实例代码,创建一个Test类,如下所示:

运行代码: Test.java编译的过程 - >Test.class->类加载器 - >JVM->代码执行。如下图1-1:

所示

1-1.png

2.如何加载类以及何时加载?

从加载到使用的一般将通过以下过程:

加载 - >验证 - >准备 - >分析 - >初始化 - >使用 - >卸载

我什么时候加载类:

例如,更改上面的代码如下:

程序启动时,它将使用main方法加载Test.class。执行main方法时,发现需要使用User.class,然后加载它。因此,当您使用它时,将加载一个类,如图1-2所示:

1-2.png

3.关于验证,准备,解决,初始化

验证阶段:验证加载到内存中的“.class”文件是否符合JVM规范,从而防止它被修改并符合JVM。

准备阶段:避免类的内存空间,将默认值赋给类变量(静态修改变量),例如int类型。

分辨率阶段:虚拟机使用直接引用的过程替换常量池中的符号引用。解析操作主要在类或接口,字段,类方法,接口方法,方法类型,方法句柄和调用点限定符上执行。

初始化阶段:执行类的初始化代码,例如分配一些静态变量,静态代码块。

请注意,当我们初始化一个类时,如果其父类尚未初始化,则将首先初始化父类。

4.班级的装载机制?

类加载器

1. BootStrapClassLoader:主要在Java安装目录(lib)下加载核心类库。

2.扩展类加载器(ExtensionClassLoader):主要在Java安装目录(lib/ext)下加载扩展类库。

3. Application Loader(ApplicationClassLoader):负责在指定的Classpath环境中加载类,这是我们编写的java代码。

4.自定义加载器:您可以根据特定需要自定义类加载器以加载特定的目录类。

5.类加载器的继承关系,如图1-3所示:

1-3.png

家长委任机制

原理:当需要加载一个类时,当前加载器将委托给他的父加载,这样如果父无法加载,该层就会被抛出并抛到顶部。然后传递下来,让下面的子类加载到当前的类加载器。

为什么这个:保证确保类库加载的安全性?想象一下,如果我们编写了一个java.lang.Object类来替换内部的jdk并由系统加载,这将导致系统无法运行,并且父代委托机制将不会发生这种情况。

简介:让父亲先加载,然后由儿子加载。一般过程如图1-4所示:

1-4.png

5. JVM的内存区域是什么,有什么用?

堆:保存实例对象。例如,代码newUser(),创建的对象放在堆中。

方法区域:存储从“.class”文件加载的类和一些静态变量。

虚拟机堆栈:在线程执行方法时存储信息,例如方法名称,方法变量信息等。

程序计数器:记录每个线程执行代码的位置。

本机方法堆栈:在执行本机方法时存储信息。

使用以下代码,从加载到执行,使用的内存区域是流程图1-5:

1-5.png

6.为什么有垃圾收集机制?

装运时会触发垃圾收集。见下面的图1-6:

1-6.png

96

Wenthkim

2019.07.2820: 39

字号1144

1. JAVA代码如何工作?

实例代码,创建一个Test类,如下所示:

运行代码: Test.java编译的过程 - >Test.class->类加载器 - >JVM->代码执行。如下图1-1:

所示

1-1.png

2.如何加载类以及何时加载?

从加载到使用的一般将通过以下过程:

加载 - >验证 - >准备 - >分析 - >初始化 - >使用 - >卸载

我什么时候加载类:

例如,更改上面的代码如下:

程序启动时,它将使用main方法加载Test.class。执行main方法时,发现需要使用User.class,然后加载它。因此,当您使用它时,将加载一个类,如图1-2所示:

1-2.png

3.关于验证,准备,解决,初始化

验证阶段:验证加载到内存中的“.class”文件是否符合JVM规范,从而防止它被修改并符合JVM。

准备阶段:避免类的内存空间,将默认值赋给类变量(静态修改变量),例如int类型。

分辨率阶段:虚拟机使用直接引用的过程替换常量池中的符号引用。解析操作主要在类或接口,字段,类方法,接口方法,方法类型,方法句柄和调用点限定符上执行。

初始化阶段:执行类的初始化代码,例如分配一些静态变量,静态代码块。

请注意,当我们初始化一个类时,如果其父类尚未初始化,则将首先初始化父类。

4.班级的装载机制?

类加载器

1. BootStrapClassLoader:主要在Java安装目录(lib)下加载核心类库。

2.扩展类加载器(ExtensionClassLoader):主要在Java安装目录(lib/ext)下加载扩展类库。

3. Application Loader(ApplicationClassLoader):负责在指定的Classpath环境中加载类,这是我们编写的java代码。

4.自定义加载器:您可以根据特定需要自定义类加载器以加载特定的目录类。

5.类加载器的继承关系,如图1-3所示:

1-3.png

家长委任机制

原理:当需要加载一个类时,当前加载器将委托给他的父加载,以便该层被抛出并抛出到顶层。如果父亲无法加载它,它将被传递下来,让下面的子类加载。直到当前的类加载器。

为什么这个:保证确保类库加载的安全性?想象一下,如果我们编写了一个java.lang.Object类来替换内部的jdk并由系统加载,这将导致系统无法运行,并且父代委托机制将不会发生这种情况。

简介:让父亲先加载,然后由儿子加载。一般过程如图1-4所示:

1-4.png

5. JVM的内存区域是什么,有什么用?

堆:保存实例对象。例如,代码newUser(),创建的对象放在堆中。

方法区域:存储从“.class”文件加载的类和一些静态变量。

虚拟机堆栈:在线程执行方法时存储信息,例如方法名称,方法变量信息等。

程序计数器:记录每个线程执行代码的位置。

本机方法堆栈:在执行本机方法时存储信息。

使用以下代码,从加载到执行,使用的内存区域是流程图1-5:

1-5.png

6.为什么有垃圾收集机制?

装运时会触发垃圾收集。见下面的图1-6:

1-6.png

1. JAVA代码如何工作?

实例代码,创建一个Test类,如下所示:

运行代码: Test.java编译的过程 - >Test.class->类加载器 - >JVM->代码执行。如下图1-1:

所示

1-1.png

2.如何加载类以及何时加载?

从加载到使用的一般将通过以下过程:

加载 - >验证 - >准备 - >分析 - >初始化 - >使用 - >卸载

我什么时候加载类:

例如,更改上面的代码。如下:

程序启动时,它将使用main方法加载Test.class。执行main方法时,发现需要使用User.class,然后加载它。因此,当您使用它时,将加载一个类,如图1-2所示:

1-2.png

3.关于验证,准备,解决,初始化

验证阶段:验证加载到内存中的“.class”文件是否符合JVM规范,从而防止它被修改并符合JVM。

准备阶段:避免类的内存空间,将默认值赋给类变量(静态修改变量),例如int类型。

分辨率阶段:虚拟机使用直接引用的过程替换常量池中的符号引用。解析操作主要在类或接口,字段,类方法,接口方法,方法类型,方法句柄和调用点限定符上执行。

初始化阶段:执行类的初始化代码,例如分配一些静态变量,静态代码块。

请注意,当我们初始化一个类时,如果其父类尚未初始化,则将首先初始化父类。

4.班级的装载机制?

类加载器

1. BootStrapClassLoader:主要在Java安装目录(lib)下加载核心类库。

2.扩展类加载器(ExtensionClassLoader):主要在Java安装目录(lib/ext)下加载扩展类库。

3. Application Loader(ApplicationClassLoader):负责在指定的Classpath环境中加载类,这是我们编写的java代码。

4.自定义加载器:您可以根据特定需要自定义类加载器以加载特定的目录类。

5.类加载器的继承关系,如图1-3所示:

1-3.png

家长委任机制

原理:当需要加载一个类时,当前加载器将委托给他的父加载,以便该层被抛出并抛出到顶层。如果父亲无法加载它,它将被传递下来,让下面的子类加载。直到当前的类加载器。

为什么这个:保证确保类库加载的安全性?想象一下,如果我们编写了一个java.lang.Object类来替换内部的jdk并由系统加载,这将导致系统无法运行,并且父代委托机制将不会发生这种情况。

简介:让父亲先加载,然后由儿子加载。一般过程如图1-4所示:

1-4.png

5. JVM的内存区域是什么,有什么用?

堆:保存实例对象。例如,代码newUser(),创建的对象放在堆中。

方法区域:存储从“.class”文件加载的类和一些静态变量。

虚拟机堆栈:在线程执行方法时存储信息,例如方法名称,方法变量信息等。

程序计数器:记录每个线程执行代码的位置。

本机方法堆栈:在执行本机方法时存储信息。

使用以下代码,从加载到执行,使用的内存区域是流程图1-5:

1-5.png

6.为什么有垃圾收集机制?

装运时会触发垃圾收集。见下面的图1-6:

1-6.png