java虚拟机启动流程到首函数调用全流程,dljd reyco郭

1 dljd,reyco郭,ssm经典教程,p15,Java命令的执行过程

  1. .java类的执行过程是
    1. 第一步:javac命令,使用编译器把.java文件编译成.class文件。
    2. 第二步:java命令,解释器运行.class文件。
  2. java命令(javac、java)的底层工作流程
    1. 第一步:启动虚拟机,jvm.dll
      1. 虚拟机的程序在哪呢?在jdk里面吧,我们来到jdk的安装目录,找找看。注意,因为我们是要运行的,所以虚拟机是在jre文件夹中放着的。看到没,这是客户端的java虚拟要。因为这就是用C和C++写的java虚拟机程序,所以它是一个.dll文件(动态链接库):
        看到没,这是服务端的java虚拟机:
        那客户端的java虚拟机和服务器端的java虚拟机这里就不具体讲了,有兴趣的同学自己去研究。
      2. 现在运行的是客户端的java虚拟机还是服务器端的java虚拟机呢?cmd,java -version:
        当然,你也可以通过一些配置,去选择运行客户端的java虚拟机。感兴趣的同学可以去网上查,这里就不说了。
    2. 第二步:虚拟机启动后,会自动加载“引导策略类加载器”,用于加载java的核心类库
      1. 引导策略类加载器是干嘛的?用于加载我们java里面的核心类库。
      2. 核心类库里面最重要的一个类库是谁?就是jre/lib下的rt.jar这个类库,我们那些最基本的java类都是放在这里面的吧:
      3. 反问你,rt.jar什么时候被加载进去的?就是虚拟机一启动,马上就会自动加载“引导策略类加载器”。然后“引导策略类加载器”,就自动把java核心类库(包括rt.jar)加载进来了,就是这个时候。
    3. 第三步:“引导策略类加载器”自动加载ExtClassLoader对象(ext类加载器对象)和AppClassLoader对象(app类加载器对象),加载进来了。
    4. 第四步:ExtClassLoader对象(ext类加载器对象),用于加载那些扩展的.jar包(类库),了解即可,如下图所示:
    5. 第五步:最关键的是,AppClassLoader对象(app类加载器对象)加载我们自定义的类(如 HelloWorld.java)
      1. 我们自定义的来是什么加载进来的?如何加载进来的?就是通过“AppClassLoader对象(app类加载器对象)”加载进来的。
      2. “AppClassLoader对象(app类加载器对象)”会去哪里去找我们自定义的类的.class文件呢?
        1. 首先,它会判断在系统变量中有没有设置classpath。
          1. 如果设置了classpath环境变量,它就按照classpath的那些路径顺序,逐个地查找,有没有我们自定义的类的.class文件。如果没找到,就报NoSuchClassException。
            1. 因为classpath里这放了很多路径,你可以放很多路径吧。
          2. 如果没有设置classpath环境变量,它会去哪里找我们自定义的类的.class文件?它会在当前路径下进行查找我们自定义的类的.class文件。如果没找到,仍然会报NoSuchClassException。
          3. 如果当前路径下有这个自定义的类的.class文件,而且我又设置了classpath环境变量。
            1. 如果classpath变量中有".;(当前路径,也是查找的范围)",它会在当前路径下和classpath下同时查找。
            2. 如果classpath变量中没有".;(当前路径,也是查找的范围)",它不会在当前路径进行查找,它只会找的是classpath。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值