首页 > 其他分享 >JVM:第一章:类加载机制深度解析

JVM:第一章:类加载机制深度解析

时间:2022-09-05 18:00:10浏览次数:124  
标签:第一章 static JVM main public 类中 加载

JVM:第一章:类加载机制深度解析

Java 源代码执行流程
在这里插入图片描述

解释:

启动虚拟机 (C++负责创建) 【windows : bin/java.exe调用 jvm.dll Linux : java 调用 libjvm.so 】

创建一个引导类加载器实例 (C++实现)

C++ 调用Java代码,创建JVM启动器,实例sun.misc.Launcher 【这货由引导加载器负责加载创建其他类加载器】

sun.misc.Launcher.getLauncher() 获取运行类自己的加载器ClassLoader --> 是AppClassLoader

获取到ClassLoader后调用loadClass(“A”)方法加载运行的类A

加载完成执行A类的main方法

程序运行结束

JVM销毁

loadClass的类加载过程
在这里插入图片描述

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

谈及比较多的是前五个

加载:我们说jvm执行的java字节码,编译后在磁盘上,总得读取这个字节码文件吧 ,通过啥读 IO呗 , 所以第一步肯定是加载字节码文件。

验证:JVM总不能说读到啥就直接运行了吧,你外面有个A.class 里面是一堆JVM规范不认识的内容,也执行不了啊 。 符合JVM规范才能执行后续的步骤,所以第二步是 校验字节码文件的正确性。

准备:给类的静态变量分配内存,并赋予默认值。 我们的类里,可能会包含一些静态变量吧 。 比如 public static final int a = 12; 得给a分配个默认值 0 ,再比如 public static User user = new User(); 给 static的变量 User分配内存,并赋默认值null (final修饰的常量,直接赋值)。

解析:这个地方不是很好理解, 解析是什么意思呢?将符号引用替换为直接引用。 符号引用 ? 直接引用? what ? 我们的类的静态方法,比如main方法,其实在Java中有个叫法 都是叫符号 。 这个阶段就会吧,一些静态方法(符号引用,比如刚才说的main方法)替换为指向数据所存内存的指针或者句柄等(直接引用)【找到具体在内存中的位置】。 这个就是静态链接过程(在类加载期间完成)。 动态链接是在程序运行期间完成的将符号引用替换为直接引用 (比如某个普通方法的调用)。

初始化:上面的步骤完事儿以后,这一步主要是对类的静态变量初始化为指定的值,执行静态代码块。 比如刚才第二步的 public static final int a = 12; ,第二步给static变量赋了默认值,这一步就该把12赋值给它了。 还有 static的 User public static User user = new User(); 实例化User。

说明:主类在运行过程中如果使用到其它类,会逐步加载这些类。jar包或war包里的类不是一次性全部加载的,是使用到时才加载。
类加载顺序示例:

public class TestDynamicLoad {
 
    static {
        System.out.println("加载TestDynamicLoad类中的静态代码块");
    }
 
    public static void main(String[] args) {
        new A();
        System.out.println("执行main方法中的代码");
        B b = null;//B不会加载,除非这里执行 new B()
 
    }
}
 
class A{
    static {
        System.out.println("加载A类中的静态代码块");
    }
 
    public A(){
        System.out.println("加载A类中的构造方法");
    }
}
 
class B{
    static {
        System.out.println("加载B类中的静态代码块");
    }
 
    public B(){
        System.out.println("加载B类中的构造方法");
    }
}
 
 
执行结果:
 
加载TestDynamicLoad类中的静态代码块
加载A类中的静态代码块
加载A类中的构造方法
执行main方法中的代码

类加载器
在这里插入图片描述
引导类加载器:负责加载支撑JVM运行的位于JRE的lib目录下的核心类库,比如rt.jar、charsets.jar等
扩展类加载器:负责加载支撑JVM运行的位于JRE的lib目录下的ext扩展目录中的JAR类包
应用程序类加载器:负责加载ClassPath路径下的类包,主要就是加载我们应用中自己写的那些类
自定义加载器:负责加载用户自定义路径下的类包

类加载器示例:

import com.sun.crypto.provider.DESKeyFactory;
import sun.misc.Launcher;
import java.net.URL;
 
public class TestJDKClassLoader {
 
    public static void main(String[] args) {

更多内容请见原文,原文转载自:https://blog.csdn.net/weixin_44519496/article/details/120322748

标签:第一章,static,JVM,main,public,类中,加载
From: https://www.cnblogs.com/wangchuanxinshi/p/16659051.html

相关文章

  • element2.x 的 Cascader 级联选择器懒加载使用及回显
    选择一种做示例:单选选择任意一级选项其中用到的配置选项说明:show-all-levels展示所有等级checkStrictly  来设置父子节点取消选中关联,从而达到选择任意一级选项的目......
  • 集合线程安全问题:第一章:集合类不安全之并发修改异常
    直接上ArrayList线程不安全代码:packagecom.javaliao.backstage;importjava.util.ArrayList;importjava.util.UUID;publicclassDemo{publicstaticvoid......
  • 关于yolov5官方项目训练的模型加载时报no module named models..Model/common
    出现该报错的原因是:训练保存的模型里包含了网络结构,结构的model类直接包含了路径地址model.yolo.Model解决办法就是重新在官方项目代码中加载模型,并再次只保存其中的模型......
  • 计算机算法设计与分析第一章总结
    1.1算法与程序算法的性质:输入、输出、确定性、有限性。程序是算法用某种程序设计语言的具体实现,可以不满足算法的有限性。1.2算法复杂性分析算法复杂性是......
  • 加载properties文件,创建c3p0数据源
    //加载properties文件ResourceBundlerb=ResourceBundle.getBundle("properties文件名称");Stringdriver=rb.getString("properties文件中数据库驱动对应的key值");St......
  • 第一章节03 运算符
    第一章节03运算符主要感受前4个就可以了有比更高级的类型运算的结果就是更高级的类型,否则都是int类型,因为结果的值默认是int关于逻辑运算存在一种短路运算inta......
  • 教材第一章读书笔记
    教材第一章读书笔记by20201321周慧琳学习目标第一章:引言第一章的引言部分包涵Unix的历史、Linux的开发和各种版本(没有提及centOS和openeuler,我们可以自己补充学习),还......
  • 第一章节02 类型与对象的问题
    第一章节02数据类型扩展整数的进制问题正如我们可以从语法中得出的那样,整数文字有四种类型:纯十进制,必须以非零数字开头。八进制,任何以0开头的数字(包括纯0)。(oct......
  • 简单加载器——分步指南
    简单加载器——分步指南HTML对于HTML,我们将只有一个带有“loader”类的div元素。<divclass="loader"></div>CSS我们只需根据需要设置宽度和高度,边框半径为50%......
  • 类加载的时机
    一个类型从被加载到虚拟机内存中开始,到卸载出内存为止,它的整个生命周期将会经历加载(Loading)、验证(Verification)、准备(Preparation)、解析(Resolution)、初始化(Initialization)......