- 执行Bootstrap Main方法
- 执行Tomcat的用户级自定义ClassLoader进行Tomcat用到的类加载
- 对Tomcat容器及相关组件进行初始化
- 对容器下关联的Web应用进行ServletContext上下文创建以及在容器中注册
- 对Web应用的下的类文件、jar文件进行加载
- 加载完成后执行ServletContextListener
- 容器与应用加载完毕后,初始化连接器下对应若干处理进程以及ServerSocketChannel监听进程
- 启动完成
StandardEngine、StandardHost的启动,它们的父容器在init的时候创建一个启动和停止子容器的线程池startStopExecutor, 然后父容器启动的时候首先通过异步的方式将子容器的启动通过org.apache.catalina.core.ContainerBase.StartChild(Callable)提交到startStopExecutor进行启动, 而子容器启动的时候首先会初始化,然后再启动。
终止:
Tomcat启动的时候的主线程会在8005端口(默认配置,可以更改)上建立socket监听,
org.apache.catalina.core.StandardServer#await()是保持tomcat运行的秘密,该方法启动一个ServerSocket,侦听发出停止的字符串。这是一个死循环。当有停止运行的字符发出,跳出此循环。
当关闭的时候,最终其实就是新起了一个进程然后向Tomcat主线程监听的8005端口发送了一个SHUTDOWN字符串,这样主线程就会结束了,主线程结束了以后,因为其它的线程都是dameon线程,这样依赖Jvm就会退出了。
Tomcat利用了shutdown hook机制来在Jvm关闭的时候关闭各个组件。CatalinaShutdownHook是一个已经初始化但是还没有启动的线程,当Jvm关闭的时候,它会启动并并发的运行所有已经注册过的shutdown hooks,多用于意外关闭Tomcat的时候,来完成优雅停机的
Tomcat用到的端口
8005 远程停服务端口
8080 为HTTP端口
8443 为HTTPS端口
8009 为AJP端口,APACHE能过AJP协议访问TOMCAT的8009端口。
"ajp-bio-8009-AsyncTimeout" daemon prio=5 tid=7f8738afe000 nid=0x115ad6000 waiting on condition [115ad5000]
"ajp-bio-8009-Acceptor-0" daemon prio=5 tid=7f8738b05800 nid=0x1159d3000 runnable [1159d2000]
"http-bio-8080-AsyncTimeout" daemon prio=5 tid=7f8735acb800 nid=0x1158d0000 waiting on condition [1158cf000]
"http-bio-8080-Acceptor-0" daemon prio=5 tid=7f8735acd000 nid=0x1157cd000 runnable [1157cc000]
"ContainerBackgroundProcessor[StandardEngine[Catalina]]" daemon prio=5 tid=7f8732850800 nid=0x111203000 waiting on condition [111202000]
"main" prio=5 tid=7f8735000800 nid=0x10843e000 runnable [10843c000]
Dameon线程又叫后台或者守护线程,它负责在程序运行期提供一种通用服务的线程,比如垃圾收集线程,非Dameon线程和Dameon线程的区别就在于当程序中所有的非Daemon线程都终止的时候,Jvm会杀死余下的Dameon线程,然后退出。
类图:
启动停止: