【JAVA基础简述】java从启动到类加载完成的内部动作

Java基础并不是会写几行代码,会几个框架那么简单,其实很多人忽略了很基础的一些知识,此总结为初学Java的时候所写,描述了Java程序开始执行的内部启动顺序。



当java ***.class被执行的时候(假设已经对JDK的基本目录结构都较熟悉之后)
     Windows系统:
     首先java.exe会找到jre(Java Runtime Environment:Java运行环境),然后找到位于jre之中的JVM.dll(java虚拟机动态链接库),具体步骤见下:
     1.java.exe会依据以下逻辑来查找JRE:(此步参照了《Java深度历险》)
          * 自己的目录下有无JRE目录。(这个部分这个说并不是很准确,原因请详见JDK原始码,这里不特别说明)
          * 父目录下有无JRE目录
          * 查询Windows Registry ( HKEY_LOCAL_MACHINE\Software\JavaSoft\Java Runtime Environment\ )
     2. 找到JRE后会继续查找java.dll文件,路径为:java\jre\bin\java.dll,如果在此目录下找不到,则会继续到其他地方寻找JRE(上面列出的从上到下依次找)。并继续查看是否有java.dll文件。
          如果都没有则会报错:
               could not find java.dll
               could not find java SE Runtime Environment
       3. 通过java.dll文件找到i386文件夹下的jvm.cfg文件。
          如果没有或者路径不正确则会报错:   
          could not     open 'e:\java\jre\lib\j386\jvm.cfg'
     4. 由于在默认情况下启动的jvm为clientjvm,所以会先查找client文件夹下有没有jvm.dll,如果没有或者不存在client文件夹,则不会主动查找其他文件夹下的jvm(如server jvm),除非使用java -server明确指定。
          如果没有找到jvm.dll则会报错:
          no 'client' JVM at 'e:\java\jre\bin\client\jvm.dll'
     5. 找到jvm.dll文件之后,接下来将加载并启动jvm
          * 首先会通过verify.dll文件来提供本地依赖库的支持 (load native library),此文件在:java\jre\bin\verify.dll。
               如果找不到此文件会报错:
               Error occurred during initialization of VM


        unable to load native library:Cat't find dependent libraries
          * 在本地依赖库将在完成之后会经过hpi.dll文件进行配置从而完成create jvm这个过程,此文件目录为:java\jre\bin\hpi.dll。
               如果找不到此文件则会报错:
                 Could not create the java vitual machine
          * jvm创建之后要初始化vm并启动,此时就到了JAVA类加载机制工作的时候。


     启动了JVM之后第一步需要做的是做一些初始化的工作(具体可参阅《深入理解java虚拟机》一书),当初始化动作完成之后,就产生了第一个类加载器“Bootstrap Loader”(这个Bootstrap Loader是由C++编写而成),此时Bootstrap Loader也会做一些初始化的动作(具体不详),然后载入定义在sun.misc命名空间下的Lanucher.java中的ExtClassLoader(inner class,编译之后会变成Launcher$ExtClassLoader.class),并设定其parent为null,代表其父载入器为Bootstarp Loader,然后Bootstrap Loader再载入定义在sun.misc命名空间底下的Lanucher.java里的AppClassLoader(同样是 inner class,编译后变成Launcher$AppClassLoader.class),并设定其父载入器为前面的ExtClassLoader实体,(AppClassLoader又叫系统载入器,虽然ExClassLoader和AppClassLoader都是由Bootstarp载入的),最后由AppClassLoader再载入前面的***.class。


到此为止 要执行***.class所需的基本类库都已经加载到内存。


附上测试java.exe寻找JRE运行环境的测试程序:


class Insect{//2
         private int i=9;
         private int x2=printInit("static Insect.x2 initialized");
         protected int j;
         Insect(){
                 System.out.println("i= "+i+" , j= "+j);
                  j=39;
        }
        private static int x1=printInit("static Insect.x1 initialized");//1
        static int printInit(String s){
              System.out.println(s);//4
              return 47;
      }
 }
      public class Beetle extends Insect{
      private int k=printInit("Beetle.k initialized");
      static Beetle b;
      Beetle a;
      public Beetle(){
              a=new Beetle(2);
              System.out.println("k= "+k);
              System.out.println("j= "+j);
        }
      public Beetle(int i){}
      private static int x2=printInit("static Beetle.x2 initialized");//3
      public static void main(String[] args){
      System.out.println("Beetle constructor");
      b=new Beetle();
     }



了解了Java基本的目录结构和Java的启动过程,就可以尝试做一个很有趣的事情:将Java运行环境缩小(或者说定制你程序的Java运行环境),不但能提高程序启动速度,还可增加程序的稳定性。


所参考书籍文章:
《Java深度历险》 王森 著
《深入理解Java虚拟机:JVM高级特性与最佳实践》 周志明 著

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值