jvm之类加载机制解析

本文详细介绍了Java程序的运行方式以及JVM的工作原理,重点讲解了类加载器的类型和职责,包括引导类加载器、扩展类加载器和应用类加载器。文章阐述了双亲委派机制的运作过程及其优点,如安全性和避免重复加载。同时,讨论了如何通过自定义类加载器打破双亲委派机制,以满足特定场景的需求,如Tomcat容器的做法。
摘要由CSDN通过智能技术生成

一、程序如何运行的

首先,我们都知道,java程序写好之后,打成jar包或者war,然后丢到服务器上启动运行,但是,到底是怎么运行的呢?java虚拟机在这里面怎么工作的?又是谁推动jvm的运转工作?

jvm底层是使用C++语言实现的,首先C++会帮我们创建jvm,然后把程序代码丢到jvm内存中,并且调用main方法,用以启动程序。

而jvm调用一些java类的方法时,是需要先进行类的加载的,只有被加载好的类才能被使用。

那么类加载,需要一个专门用来加载类的工具,我们称之为类加载器。

  1. 首先C++帮我们创建jvm
  2. C++创建一个引导类加载器,它是最顶层的类加载器
  3. 然后C++调用java的代码创建jvm的启动器Launcher的实例  Launcher有引导类加载器加载
  4. 创建Launcher实例过程中,会创建两个加载器:ExtClassLoad 和 AppClassLoad 加载器
  5. 然后使用AppClassLoad加载器按照双亲委派机制加载需要加载的类,之后调用main方法启动。
  6. java程序执行结束,jvm销毁。

二、类加载器

java类的加载是使用类加载器加载,那么类加载器有哪些?分别负责加载哪些类?如何工作的?

类加载器有哪些?分别负责加载哪些类?

  1. 引导类加载器(BootStrapClassLoader):负责加载支撑jvm运行的位于jre的lib目录下的rt.jar,charset.jar等核心类库中类
  2. 扩展类加载器(ExtClassLoader):负责加载支撑jvm运行的位于jre的lib目录下的ext扩展目下的核心类库中的类
  3. 应用类加载器(AppClassLoader):负责加载应用程序中自己创建类
  4. 自定义类加载器:负责加载自定义路径下的类

类加载过程分为:加载->验证->准备->解析->初始化

类加载器的创建

public class Launcher {
    private static URLStreamHandlerFactory factory = new Launcher.Factory();
    // 静态变量 该类在被加载的初始化阶段 被实例化 调用构造方法  单例模式
    private static Launcher launcher = new Launcher();
    private static String bootClassPath = System.getProperty("sun.boot.class.path");
    private ClassLoader loader;
    private static URLStreamHandler fileHandler;

    //jvm调用此方法 获取实例
    public static Launcher getLauncher() {
        return launcher;
    }

    //构造方法
    public Launcher() {
        Launcher.ExtClassLoader var1;
        try {
            //创建ExClassLoader扩展类加载器
            var1 = Launcher.ExtClassLoader.getExtClassLoader();
     
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值