-->

后端面试38讲_09_答疑丨Java_Web程序的运行时环境到底是怎样的

你好,我是李智慧。

今天是第一模块的最后一讲。

在这一模块呢我们主要讲了软件的基础原理。

今天我将会针对这一模块中大家提出的问题进行总结和答疑,让我们整理一下,再接着学习下一个模块的内容。

首先,小美同学问道,既然一个JVM是一个进程,JVM上跑tomcat, tomcat at可以部署多个应用。

这样的话每个跑在totomcat上的应用是一个线程吗?来怎么理解?如果一个应用crash了,其他应用也会crash呢?理解程序运行时的执行环境,直观感受程序是如何运行的?对于我们开发和维护软件很有意义。

我们以小美同学提出的这个场景为例,看一下java web程序的运行环境是怎样的。

来重新梳理一下进程线程应用web容器、java虚拟机和操作系统之间的关系。

我们用java开发web应用开发完成,并以打包以后呢,得到的是呢这个哇包包放crastotomcat的应用程序路径下启动tomcat,就可以通过HTTP请求访问这个web应用了。

在这个场景下,进程是哪个线程,是哪些web程序的,外包是如何被执行的,HTP请求如何被处理?Tomcat在这里扮演的是什么角色?Tvm又扮演什么角色?首先,我们是通过执行tomcat的,需要脚本启动tomcat,而在需要脚本里其实启动的就是java虚拟机。

所以我们在linux操作系统中执行tomcat的需要启动脚本。

Tomcat启动以后呢,其实是在操作系统里看到的,是一个GVM虚拟机进程。

这个虚拟机进程启动以后呢,加载class进来执行。

首先加载的就是这个boot stp类这个类里面有一个命令,函数是整个tomcat的入口函数。

Java虚拟机会启动一个主线程,从这个入口函数开始执行主线程从bootstp的main函数开始执行初始化tomcat内部运行环境。

这个时候啊就需要创建一一些程程,比如负监听听黎端口的线程啦,处理客户端连接请求的线程啦,以及执行用户请求的线程等等。

创建这些线程的代代totomcat代码的一部分。

初始化运行环境以后,tomcat就会扫描web程序路径,扫描到我们开发的包以后啊,再加载包里的类到weweg VM.因为web应用是被tomcat加载运行的,所以呢我们也称tomcat为web应用容器。

如果有部请求发送到wetomcat,也就是说部程序通过八零端口和wetomcat进行HTTP.通信的时候,tomcat会据web包中的web at XL配置决定这个请求UVI应该该由哪个servleat处理。

然后tomcat就会分配一个线程去处理这个请求。

事实上呢,就是由这个线程执行相应的servelite代码。

让我们回到小美同学的问题。

Tom cat启动的时候,实际上启动的是GYM进程。

这个进程呢首先执行GVM的代码,而GYM会加载tomcat的class,执行并分配一个主线程。

这个主线程会从main函数开始执行。

在主线程执行的过程中呢,tomcat代码还从启动一些其他的线程,包括处理HTTP请求的线程。

而我们开发的应用的一些class被tom cat加载到这个JYM里执行。

所以即使这里有多个应用被加载,也只是加载了一些线ass.我们的应用被加载进来以后啊,并没有增加GVM进程中的线程数。

也就是说,web应用本身和线程是没有关系的。

而tomcat会根据HTTP请求URL执行应用中的代程。

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

如果web代码中包含了创建新线程的代码,tomcat的在执行代码的时候呢,就会创建出新的线程,这些线程也会被操作系统调度执行。

如果tom cat的线程在执行代码时抛出了未处理的异常,那么当前线程就会结束执行。

但时如控制台可以看到异常信息。

其实啊如果线程的堆栈执行线程会把异常信息以及当前堆栈的方法都打印出来,事实上这个异常最后还是会被tomcash误实。

如果tomcat会给客户端返回一个状态,码是五零零的HTTP错误。

单个线程的异常不会影响其他线程执行,也就是不会影响其他请求的处理。

最是如果线程在执行代码的时候,抛出的是GVM错误。

比如r tom memory.这个时候呢看起来是应用acrocrash,实际上是整个进程都无法继续执行的,也就是进程crash的进程内,所有的应用都不会被继续执行的。

从GVM的异常,tom tomcat,我们的web应用是一样的,都是一些java代码,但是tomcat却可以加载执行web代码,而我们的代码又不依赖tomcat,这是一个很有意思的话题。

Tomcat是如何设计的?我将会在下一个模块讲述。

在我的第二篇,文章中讲到了哈希表的时间复杂度。

为什么是OE?有同学提出了疑惑,很难想象这个问题居然有阿里大厂的面试官觉得难,这不是一个疑问,但其实是一个有意思的话题。

我花一点时间讨论一下,也许会对你的职业规划有所启发。

文中这个故事呢大概发生在二零零九年整整十年前。

那个时候互联网还不像今天这样炙手可热,提供的薪水也不像今天这样有竞争力,也没有BAT这样的专有名词指代所谓的互联网巨头。

那个时候计算机专业优秀的毕业生向往的是微软oracle ABM这样的未知IT巨头退而求其次,国内好的IT公司是联想拥有这些企业。

那实上呢,那个时候在技术研发能力上,互联网公司的技术能力是落后于传统企业的。

阿里巴巴最核心的数据重组依赖的是ABM oracle EMC的解决方案,也就是所谓的IOE一。

所以在十年前的人才市场上啊,国内互联网公司的形象一般是技术落后,薪水一般加班严重,没有名气。

可以说,在人才市场的竞争中,相对于国内外的IT巨头是落于下风的。

我个人感觉,互联网公司崛起成为传统IT巨头。

大概是在七八年前,当时移动互联网开始出现互联网的渗透得到加速,BIT逐渐成为家喻户晓的名字,名气大涨。

其次呢,经过前面时间的积累,互联网企业主导的各种分布式技术啊,大数据技术、啊,移动互联网技术、云计算技术的风头超过了传统的IT巨头。

比如阿里巴巴呢开始去IOE打造自己的云计算平台,成为先进技术的代表者。

当然最主要的还是互联网企业的盈利能力,大幅增速,能够提供市场上更有竞争力的薪水和股票。

于是啊互联网企业在人才市场上开始变得左手可热BIT,这些企业开始被人称为大厂。

我们今天感觉这些互联网巨头高高在上,人们纷纷向往。

实际上呢这个现象出现的时间非常短。

今天这些企业有足够的名气和资源,将自己营造的高高在上,可以在众多优秀的候选人中挑来选去。

仅仅在十年前都还不是这样的。

但是事情真正的诡调之处还不在此。

当今这些互联网大厂的核心技术和业务模式,大概是在十几年前就奠定了的。

经过几年的摸索,大概在七八年前就开始稳定成熟。

也就是说啊,互联网企业的技术实力和商业能力,是在这些企业还不太出名的时候就发展起来的。

但是呢在这些企业成为明星之后,并没有什么突破性的进展。

想想这些所谓的互联网大厂,最近几年并没有什么值得称道的商业模式创新和技术创新。

也就是说啊十多年前可能是一些并不优秀的技术人员加入了一个并不出名的公司。

然后这些人开创出了一个杰出的事业,用马云的话说,就是二流的人做一流的事。

然后呢,公司开始挑选一流的人,但结果似乎只是在维持这个事业,今没有开创出更加杰出的事业。

今天的BAP似乎成为当年的IBM,后后好像进入了某种循环。

如果这就是事情的真相,我想你或许可以从其中得出某些启发,重新考虑一下未来的职业规划。

也许你会发现,你可能并不需要追逐当前最热门的所谓的新技术,而应该好好想一想,需要为自己的未来准备些什么。

最后,在第一模块中,我在每一篇文章的下面都留了几道思考题。

各位同学在评论区都有很好的答案,但只有第五篇文章,我似乎没有看到比较准确的答案。

我在这里回答一下,read五中校验位之所以是螺旋式的,落在所有的硬盘上,主要原因是如果将校验位记录在同一块硬盘上,那么对于其他多块数据盘,任何一块硬盘修改数据,都需要修改这个校验盘上的校验数据。

也就是说啊对于有八块硬盘的read,五阵列校验盘的数据写入压力呢是其他数据盘的七倍。

而硬盘的频繁写入会导致硬盘寿命缩短,校验盘会频繁的损坏,存储的整体可用性和维护性都会变差。

所以啊作为软件架构时,当你在进行软件设计的时候,不光要考虑软件本身,你还需要了解软件的各种约束。

硬盘的特性约束就是其中一种。

当然还有其他的一些约束,我会在专栏的下面模块中继续的讲解,如何在各种约束下设计出符合期望的软件系统。