1.执行java xxx.class2.找到本机安装的JRE3.找到jvm.dll(这个jvm.dll是client目录下的呢还是server目录下的呢,两者有什么不同?)4.启动JVM并进行初始化。5.产生Bootstrp Loader (加载\jre\lib目录下的rt.jar charsets.jar)6.载入ExtClassLoader(加载\ext\目录下的jar文件)7.载入AppClassLoader(加载自己的.class)
tomcat的类加载机制 这里采用tomcat6的类加载机制,以下是网上摘取的资料
 Tomcat6 类装载器的实现都是通过继承于JDK中的 java.lang.ClassLoader类。
    包括Bootstrap,System,Common和Webapp这四种类加载器来实现不同目录的类文件装载。    示例结构如下:
      Bootstrap
          |
       System
          |
       Common
       /     \
  Webapp1   Webapp2 ...    * Bootstrap classes of your JVM
    * System class loader classses (described above)
    * /WEB-INF/classes of your web application
    * /WEB-INF/lib/*.jar of your web application
    * $CATALINA_HOME/lib
    * $CATALINA_HOME/lib/*.jar 那么请问当我启动tomcat的时候,例如在Windows下执行tomcat6.exe 这时JVM是由谁启动的呢,tomcat6\bin目录下的bootstrap.jar与tomcat-juli.jar是由谁载入的?
这时候\jre\bin\目录下的rt.jar由谁载入?

解决方案 »

  1.   

    有一个很简单的原则,
    由一个ClassLoader加载的类,其关联的Class在解析时也由该ClassLoader加载。本身java命令的调用就会起动JVM, 然后用AppClassLoader加载有main方法的类,比如你起动TOMCAT,实际上是调用了TOMCAT,Main类main方法。这个方法初始TOMCAT环境,然后deploy应用。
    因为Main是通过AppClassLoader加载的,所以所有与Main有关的Class也都是AppClassLoader加载的。所以bootstrap.jar是由AppClassLoader加载的。自定义的ClassLoader是必须主动调用的,至于tomcat-juli.jar要看它是由那个类引用的。rt.jar是由AppClassLoader代理到bootStrapClassLoader的。当然这只是对这个例子来说,一个jar也有可能被不同的ClassLoader加载。
      

  2.   

    1. tomcat6.exe是会载入jvm.dll启动虚拟机.
    2. tomcat6\bin目录下的bootstrap.jar与tomcat-juli.jar是由于System或Common ClassLoader载入的, 具体去看bootstrap.java(好像是这个)3.
    ====================================================================
    http://blog.chenlb.com/2009/06/java-classloader-architecture.html
    # Bootstrap ClassLoader/启动类加载器
    主要负责jdk_home/lib目录下的核心 api 或 -Xbootclasspath 选项指定的jar包装入工作。
    # Extension ClassLoader/扩展类加载器
    主要负责jdk_home/lib/ext目录下的jar包或 -Djava.ext.dirs 指定目录下的jar包装入工作。
    # System ClassLoader/系统类加载器
    主要负责java -classpath/-Djava.class.path所指的目录下的类与jar包装入工作。
    ====================================================================
      

  3.   

    4.JVM.dll有 client, server两个版本, server的可能是对服务器的做了一些优化, 启动虚拟机可能慢些,但是运行之后响应一些请求可能快些。
    client的dll可能启动会快些。
      

  4.   


    是看 Tomcat源码,才几M好像。到 他们的 CVS上直接拉一版。然后再启动类里面设个断点。就知道他是如何运行的。
      

  5.   


    tomcat的类加载器也是双亲委派模式,子类加载器怎么回去加载它的父加载器呢?
    bootstrap.jar里面应该是创建bootstrapClassLaoder