写点什么

Java web 程序的运行时环境

用户头像
Geek_571bdf
关注
发布于: 1 小时前

1. 线程、进程、应用、虚拟机、操作系统、web 容器之间的关系。

 

首先,java web 程序写好、编译打包后得到的是一个 war 包。把这个 war 包放入 tomcat 路径下,启动 tomcat 就可以通过 HTTP 请求这个应用了。

 

首先通过 shell 命令启动 tomcat:java org.apache.catalina.startup.Bootstrap "$@" start

而在 Shell 脚本里,其实启动的是 Java 虚拟机。虚拟机启动后,会加载 class 进来执行,首先加载的是 org.apache.catalina.startup.Bootstrap,该类中的 main()函数,是整个 Tomcat 的入口函数,JVM 会启动一个主线程从这个入口函数开始执行。

该函数会初始化 Tomcat 的运行环境,即,创建一些线程。比如负责监听 80 端口的线程,处理客户端连接请求的线程,以及执行用户请求的线程。创建这些线程的代码是 Tomcat 代码的一部分。

 

初始化运行环境之后,Tomcat 就会扫描 Web 程序路径,得到 war 包、加载 war 包里的类到 JVM。由于 web 应用是被 tomcat 加载运行的,因此 tomcat 也称为 web 容器。

 

当外部程序通过 80 端口和 Tomcat 进行 HTTP 通信的时候,Tomcat 会根据 war 包中的 web.xml 配置,决定这个请求 URL 应该由哪个 Servlet 处理,然后 Tomcat 就会分配一个线程去处理这个请求,这个线程执行的是相应的 Servlet 代码。

可以理解成每个请求分配一个线程,每个线程执行的都是我们开发的 Web 代码。

 

注意:

1. web 应用本身和线程是没有关系的。哪怕我们有多个应用,但对于 tomcat 来说,也就是多加载了一些 class,而加载 class 并不会增加线程数。

2. 如果执行时抛出的是 JVM 错误,比如 OutOfMemoryError,此时进程内所有应用都不会被继续执行了。

 

tomcat 跑在 jvm 上,而 jvm 在操作系统看来,也仅仅是一个进程。另外,从 jvm 的角度看,tomcat 和 web 应用一样,是一些 java 代码,但 Tomcat 却可以加载执行 Web 代码,而我们的代码又不依赖 Tomcat。

用户头像

Geek_571bdf

关注

还未添加个人签名 2019.06.13 加入

还未添加个人简介

评论

发布
暂无评论
Java web程序的运行时环境