Tomcat笔记3(server启动分析)
Tomcat的启动是从Bootstrap类当中的main方法开始的,在bat文件的启动命令脚本最终echo之后,其中的输出是org.apache.catalina.startup.Bootstrap.main start,开始发动tomcat。
进入main函数中分析其流程:
实例化Bootstrap之后,进入其init()方法当中,
其中设定了catalina.home和catalina.base路径。
以上步骤获取了系统工作路径,接下来进行类加载器的初始化(setup),initClassLoaders(),方法内容如下:
三个模块:
Class Loader System
Runtime Data Area
Execution Engine
其中Runtime Data Area 包括5种区域:
Heap & Method Area;
JavaStack & Native Method Stack;
Program Counter
以Bootstrap类启动为例,在JVM启动时将之载入内存的具体流程如下:
路径:org.apache.catalina.startup.Bootstrap,启动之前将Bootstrap类对应的Class文件当中的类型信息提取出来,load到JVM的Method Area当中,这也是被称作RTTI(Run-Time Type Infomation)用来保存运行时类型信息的一种方式。而且,这个Method Area是多线程共享的,所以当存在两个线程需要同时读取一个类的类型信息时,如果该类还没有被载入,则只能由其中一个线程先去将之load进来,另一线只有先等待了。
Method Area的具体内容:
Type Information
The Constant Pool
Field Information
Method Information Class Variables
A Reference to Class ClassLoader
A Reference to Class Class
Method Tables
之后,读取代码当中的静态初始化内容:
在这个图当中stack frame2对应的方法A被先调用,压栈之后,在其中调用stack frame2对应B方法,frame2被压栈。可以看出在Java 当中,栈并不是跟着方法走的,只是存储线程相关信息的地方,在方法调用时不会新产生stack,当然线程间的调用除外。
JVM在是否通过反射显示加载上将加载分为所谓的两种:显式加载和隐式加载;
从是否及时加载分成两种:pre-loading和lazy-loading。
而ClassLoader本身也有四种类型:BootstrapClassLoader,ExtensionClassLoader,AppClassLoader,URLClassLoader.分别针对一种加载场景,不过可以使用不同的ClassLoader加载一个相同Class,但是该Class对象的内容在启动JVM时通过pre-loading的方式加载系统的基本类库,其顺序大致如下:
BootstrapClassLoader
|
ExtensionClassLoader
|
AppClassLoader
通过New A().getClass().getClassLoader().toString()测试得到:
通过MBeanFactory取得一个MBeanServer实例,并将init之后的ClassLoader注册,之后负责针对该MBean管理。// Shut down the server try { getServer().stop(); } catch (LifecycleException e) { log.error("Catalina.stop", e); }
所以对应于tomcat的启动方式start和startd,在关闭时应该分别调用stop和stopd,在使用eclipse将tomcat嵌入进去的时候,应该通过startd和stopd方式进行启动和终止,需要tomcat独立运行的时候则通过start和stop进行启动和终止,通过主线程维持连接。
在启动之前的load方式:
在start之前,load当中通过digest的方式进行系统组件的加载。通过反射调用Catalina的load方法,在其中通过createStartDigester();方法创建digester对象,读取系统的server.xml文件将其中的各个组件加入add到digester当中。
本地的启动描述文件的路径:
D:/dev/tomcat7.0/output/build/webapps/docs/architecture/startup/serverStartup.txt
文本:
http://tomcat.apache.org/tomcat-7.0-doc/architecture/startup/serverStartup.txt
UML:
http://tomcat.apache.org/tomcat-7.0-doc/architecture/startup/serverStartup.pdf