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由谁载入?
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由谁载入?
由一个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. 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包装入工作。
====================================================================
client的dll可能启动会快些。
是看 Tomcat源码,才几M好像。到 他们的 CVS上直接拉一版。然后再启动类里面设个断点。就知道他是如何运行的。
tomcat的类加载器也是双亲委派模式,子类加载器怎么回去加载它的父加载器呢?
bootstrap.jar里面应该是创建bootstrapClassLaoder