Java——《面试题——tomcat篇》

news2024/11/17 7:19:36

全文章节

Java——《面试题——基础篇》

Java——《面试题——JVM篇》

Java——《面试题——多线程&并发篇》

Java——《面试题——Spring篇》

Java——《面试题——SpringBoot篇》

Java——《面试题——MySQL篇》​​​​​​

Java——《面试题——SpringCloud》

Java——《面试题——Dobbo篇》

Java——《面试题——Nginx篇》

Java——《面试题——MQ篇》

Java——《面试题——Linux篇》

Java——《面试题——Zookeeper篇》

Java——《面试题——Redis篇》

Java——《面试题——分布式篇》

Java——《面试题——网络篇》

Java——《面试题——设计模式篇》

Java——《面试题——maven篇》

Java——《面试题——ElasticSearch篇》

Java——《面试题——tomcat篇》​​​​​​

Java——《面试题——Git篇》

Java——《面试题——软实力篇》

本文目录

1、Tomcat的缺省端口是多少,怎么修改?

2、tomcat 有哪几种Connector 运行模式(优化)?

3、Tomcat有几种部署方式?

4、tomcat容器是如何创建servlet类实例?用到了什么原理?

5、tomcat 如何优化?

6、熟悉tomcat的哪些配置?

7、Tomcat是什么?

8、什么是Servlet呢?

9、什么是Servlet规范?

10、为什么我们将tomcat称为Web容器或者Servlet容器 ?

11、tomcat是如何处理Http请求流程的?

12、tomcat结构目录有哪些?


1、Tomcat的缺省端口是多少,怎么修改?

默认端口为8080,可以通过在tomcat安装包conf目录下,service.xml中的Connector元素的port 属性来修改端口。

2、tomcat 有哪几种Connector 运行模式(优化)?

这三种模式的不同之处如下:

BIO :一个线程处理一个请求。缺点:并发量高时,线程数较多,浪费资源。Tomcat7版本或更低 版本中,在Linux系统中默认使用这种方式。

NIO :利用Java的异步IO处理,可以通过少量的线程处理大量的请求。tomcat8.0.x中默认使用的是 NIO。Tomcat7必须修改Connector配置来启动:

<Connector port="8080" protocol="ong.apache.coyote.http11.Http11NioProtocol"

connectionTimeout="2000e" redirectPort="8443"/>

APR :即Apache Portable Runtime,从操作系统层面解决io阻塞问题。Tomcat7或Tomcat8在 Win7或以上的系统中启动默认使用这种方式。

3、Tomcat有几种部署方式?

  • 利用Tomcat的自动部署:把web应用拷贝到webapps目录(生产环境不建议放在该目录 中)。Tomcat在启动时会加载目录下的应用,并将编译后的结果放入work目录下。
  • 使用Manager App控制台部署:在tomcat主页点击“Manager App” 进入应用管理控制台,可 以指定一个web应用的路径或war文件。
  • 修改 conf/server.xml 文件部署:在 server.xml 文件中,增加Context节点可以部署应用。
  • 增加自定义的Web部署文件:在 conf/Catalina/localhost/ 路径下增加 xyz.xml文件,内容是 Context节点,可以部署应用。

4、tomcat容器是如何创建servlet类实例?用到了什么原理?

1. 当容器启动时,会读取在webapps目录下所有的web应用中的web.xml文件,然后对 xml文件 进行解析,并读取servlet注册信息。然后,将每个应用中注册的servlet类都进行加载,并通过 反射的方式实例化。(有时候也是在第一次请求时实例化)

2. 在servlet注册时加上1如果为正数,则在一开始就实例化,如果不写或为负数,则第一次请求 实例化。

5、tomcat 如何优化?

tomcat作为Web服务器,它的处理性能直接关系到用户体验,下面是几种常见的优化措施:

去掉对web.xml的监视,把jsp提前编辑成Servlet。有富余物理内存的情况,加大tomcat使用的jvm的内存

服务器所能提供CPU、内存、硬盘的性能对处理能力有决定性影响。

  • 对于高并发情况下会有大量的运算,那么CPU的速度会直接影响到处理速度。
  • 内存在大量数据处理的情况下,将会有较大的内存容量需求,可以用-Xmx -Xms - XX:MaxPermSize等参数对内存不同功能块进行划分。我们之前就遇到过内存分配不足,导致 虚拟机一直处于full GC,从而导致处理能力严重下降。
  • 硬盘主要问题就是读写性能,当大量文件进行读写时,磁盘极容易成为性能瓶颈。最好的办法 还是利用下面提到的缓存。

利用缓存和压缩

  • 对于静态页面最好是能够缓存起来,这样就不必每次从磁盘上读。这里我们采用了Nginx作为 缓存服务器,将图片、css、js文件都进行了缓存,有效的减少了后端tomcat的访问。
  • 另外,为了能加快网络传输速度,开启gzip压缩也是必不可少的。但考虑到tomcat已经需要处 理很多东西了,所以把这个压缩的工作就交给前端的Nginx来完成。
  • 除了文本可以用gzip压缩,其实很多图片也可以用图像处理工具预先进行压缩,找到一个平衡 点可以让画质损失很小而文件可以减小很多。曾经我就见过一个图片从300多kb压缩到几十 kb,自己几乎看不出来区别。

采用集群

单个服务器性能总是有限的,最好的办法自然是实现横向扩展,那么组建tomcat集群是有效提升性 能的手段。我们还是采用了Nginx来作为请求分流的服务器,后端多个tomcat共享session来协同工 作。可以参考之前写的《利用nginx+tomcat+memcached组建web服务器负载均衡》。

优化线程数优化

找到Connector port="8080" protocol="HTTP/1.1",增加maxThreads和acceptCount属性(使 acceptCount大于等于maxThreads),如下:

<Connector port="8080" protocol="HTTP/1.1"connectionTimeout="2000e"

redirectPort="8443"acceptCount="50o" maxThreads="400"/>

其中:

  • maxThreads:tomcat可用于请求处理的最大线程数,默认是200
  • minSpareThreads:tomcat初始线程数,即最小空闲线程数
  • maxSpareThreads:tomcat最大空闲线程数,超过的会被关闭
  • acceptCount:当所有可以使用的处理请求的线程数都被使用时,可以放到处理队列中的请求数,超过 这个数的请求将不予处理.默认100

使用线程池优化

在server.xml中增加executor节点,然后配置connector的executor属性,如下:

<Executor name="tomcatThreadPool"namePrefix="req-exec-"maxThreads="1000"

minSpareThreads="50"maxIdleTime="6088o" / >
<Connector port="8080" protocol="HTTP/1.1"executor="tomcatThreadPool" />

其中:

namePrefix:线程池中线程的命名前缀

  • maxThreads:线程池的最大线程数
  • minSpareThreads:线程池的最小空闲线程数
  • maxIdleTime:超过最小空闲线程数时,多的线程会等待这个时间长度,然后关闭
  • threadPriority:线程优先级

注:当tomcat并发用户量大的时候,单个jvm进程确实可能打开过多的文件句柄,这时会报 java.net.SocketException:Too many open files错误。可使用下面步骤检查:

  • ps -ef |grep tomcat 查看tomcat的进程ID,记录ID号,假设进程ID为10001
  • lsof -p 10001|wc -l 查看当前进程id为10001的 文件操作数
  • 使用命令:ulimit -a 查看每个用户允许打开的最大文件数

启动速度优化

  • 删除没用的web应用:因为tomcat启动每次都会部署这些应用。
  • 关闭WebSocket: websocket-api.jar和tomcat-websocket.jar 。
  • 随机数优化:设置JVM参数: -Djava.security.egd=file:/dev/./urandom 。

内存优化

因为tomcat启动起来后就是一个java进程,所以这块可以参照JVM部分的优化思路。堆内存相关参 数,比如说:

  • -Xms:虚拟机初始化时的最小堆内存。
  • -Xmx:虚拟机可使用的最大堆内存。-Xms与-Xmx设成一样的值,避免JVM因为频繁的GC导致性 能大起大落
  • -XX:MaxNewSize:新生代占整个堆内存的最大值。

另外还有方法区参数调整(注意:JDK版本)、垃圾收集器等优化。JVM相关参数请看:   手把手教你设置JVM调优参数

6、熟悉tomcat的哪些配置?

  • Context (表示一个web应用程序,通常为WAR文件,关于WAR的具体信息见servlet规范)标签。
  • docBase :该web应用的文档基准目录(Document Base,也称为Context Root),或者是WAR 文件的路径。可以使绝对路径,也可以使用相对于context所属的Host的appBase路径。
  • path :表示此web应用程序的url的前缀,这样请求的url为 http://localhost:8080/path/**** 。
  • reloadable :这个属性非常重要,如果为true,则tomcat会自动检测应用程序的/WEB-INF/lib 和/WEB-INF/classes目录的变化,自动装载新的应用程序,我们可以在不重启tomcat的情况下改变 应用程序。
  • useNaming :如果希望Catalina为该web应用使能一个JNDI InitialContext对象,设为true。该 InitialialContext符合J2EE平台的约定,缺省值为true。
  • workDir :Context提供的临时目录的路径,用于servlet的临时读/写。利用 javax.servlet.context.tempdir属性,servlet可以访问该目录。如果没有指定,使用 $CATALINA_HOME/work下一个合适的目录。
  • swallowOutput :如果该值为true,System.out和System.err的输出被重定向到web应用的 logger。如果没有指定,缺省值为false
  • debug :与这个Engine关联的Logger记录的调试信息的详细程度。数字越大,输出越详细。如果没 有指定,缺省为0。
  • host (表示一个虚拟主机)标签。
  • name :指定主机名。
  • appBase :应用程序基本目录,即存放应用程序的目录。
  • unpackWARs :如果为true,则tomcat会自动将WAR文件解压,否则不解压,直接从WAR文件中运 行应用程序。
  • Logger (表示日志,调试和错误信息)标签。
  • className :指定logger使用的类名,此类必须实现org.apache.catalina.Logger接口。
  • prefix :指定log文件的前缀。
  • suffix :指定log文件的后缀。
  • timestamp :如果为true,则log文件名中要加入时间,如下例:localhost_log.2001-10-04.txt。

7、Tomcat是什么?

Tomcat 服务器Apache软件基金会项目中的一个核心项目,是一个免费的开放源代码的Web 应用服 务器(Servlet容器),属于轻量级应用服务器,在中小型系统和并发访问用户不是很多的场合下被 普遍使用,是开发和调试JSP 程序的首选。

8,什么是Servlet呢?

Servlet是JavaEE规范的一种,主要是为了扩展Java作为Web服务的功能,统一接口。由其他内部厂 商如tomcat,jetty内部实现web的功能。如一个http请求到来:容器将请求封装为servlet中的 HttpServletRequest对象,调用init(),service()等方法输出response,由容器包装为httpresponse 返回给客户端的过程。

 9,什么是Servlet规范?

 从 Jar 包上来说,Servlet 规范就是两个 Jar 文件。servlet-api.jar 和 jsp-api.jar,Jsp 也是一种 Servlet。

从package上来说,就是 javax.servlet 和 javax.servlet.http 两个包。

从接口来说,就是规范了 Servlet 接口、Filter 接口、Listener 接口、ServletRequest 接口、 ServletResponse 接口等。类图如下:

10、为什么我们将tomcat称为Web容器或者Servlet容器 ?

我们用一张图来表示他们之间的关系:

 简单的理解:启动一个ServerSocket,监听8080端口。Servlet容器用来装我们开发的Servlet。

11,tomcat是如何处理Http请求流程的?

假设来我们在浏览器上输入 http://localhost:8080/my-web-mave/index.jsp

在tomcat中是如何处理这个请求流程的:

1. 我们的请求被发送到本机端口8080,被在那里侦听的Coyote HTTP/1.1 Connector获得。

2. Connector把该请求交给它所在的Service的Engine来处理,并等待来自Engine的回应 。

3. Engine获得请求localhost/my-web-maven/index.jsp,匹配它所拥有的所有虚拟主机Host , 我们的虚拟主机在server.xml中默认配置的就是localhost。

4. Engine匹配到name=localhost的Host(即使匹配不到也把请求交给该Host处理,因为该Host 被定义为该Engine的默认主机)。

5. localhost Host获得请求/my-web-maven/index.jsp,匹配它所拥有的所有Context。

6. Host匹配到路径为/my-web-maven的Context(如果匹配不到就把该请求交给路径名为”"的 Context去处理)。

7. path=”/my-web-maven”的Context获得请求/index.jsp,在它的mapping table中寻找对应的 servlet 。

8. Context匹配到URL PATTERN为*.jsp的servlet,对应于JspServlet类。

9. 构造HttpServletRequest对象和HttpServletResponse对象,作为参数调用JspServlet的doGet 或doPost方法 。

10. Context把执行完了之后的HttpServletResponse对象返回给Host 。 11. Host把HttpServletResponse对象返回给Engine 。

12. Engine把HttpServletResponse对象返回给Connector 。

13. Connector把HttpServletResponse对象返回给客户browser 。

12、tomcat结构目录有哪些?

 bin

启动,关闭和其他脚本。这些 .sh文件(对于Unix系统)是这些.bat文件的功能副本(对于 Windows系统)。由于Win32命令行缺少某些功能,因此此处包含一些其他文件。

比如说:windows下启动tomcat用的是startup.bat,另外Linux环境中使用的是startup.sh。对应 还有相应的shutdown关闭脚本。

conf

tomcat的配置文件和相关的DTD。这里最重要的文件是server.xml。它是容器的主要配置文件。

catalina.policy :tomcat:安全策略文件,控制JVM相关权限,具体可以参考 java.security.Permission。

catalina.properties :tomcat Catalina 行为控制配置文件,比如:Common ClassLoader。

logging.properties :tomcat日志配置文件。里面的日志采用的是JDK Logging。

server.xml :tomcat server配置文件(对于我开发人员来说是非常重要)。

context.xml :全局context配置文件,监视并加载资源文件,当监视的文件发生发生变化时,自 动加载 。

tomcat-user.xml :tomcat角色配置文件。

web.xml :Servlet标准的web.xml部署文件,tomcat默认实现部分配置 入内:

  • org.apache.catalina.servlets.DefaultServlet。
  • org.apache.jasper.servlet.JspServlet

logs

日志文件默认位于此处。

localhost 有用,当你们的tomcat启动不了的时候,多看这个文件。比如:

  • NoClassDefFoundError
  • ClassNotFoundException

access 最没用。

catalina.{date} 主要是控制台输出,全部日志都在这里面。

webapps

这是您的webapp所在的位置。其实这里面这几个都是一个项目。

简化web部署的方式。在线上环境中我们的应用是不会放在这里的。最好的办法就是外置。

lib

tomcat存放共用的类库。

比如: ecj-4.17.jar: eclipse Java编译器 jasper.jar:JSP编译器。

work

存放tomcat运行时编译后的文件,比如JSP编译后的文件 。

temp

存放运行时产生的临时文件。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/711697.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

干货 | 智慧教育平台生成式人工智能应用的安全要求

以下内容整理自清华大学《数智安全与标准化》课程大作业期末报告同学的汇报内容。 第一部分&#xff1a;编制说明 标准制定的基本原则主要包括以下四个方面&#xff1a; 综合性&#xff1a;本标准全面漫盖了智慧教育平台ChatGPT安全保护的要求&#xff0c;以便用户参考&#xf…

Spring:Bean

Bean 概述配置方式自动装配继承与依赖作用域外部属性文件的使用 概述 Spring 容器负责管理依赖注入&#xff0c;它将被管理的对象都称为 bean 。我们通过 xml 文件配置方式进行对 bean 的声明和管理。 写法如下&#xff1a; <beans><bean id"bean的唯一标识符…

Scrapy框架--CrawlSpider (详解+例子)

目录 CrawlSpider 简介 基本运行 特性和概念 基本使用 创建CrawlSpider 运行 使用CrawlSpider中核心的2个类对象 Rule对象 LinkExtractors 作用 使用 查看效果-shell中验证 示例 注意 CrawlSpider 简介 CrawlSpider 是 Scrapy 框架提供的一个特殊的 Spider 类…

Jvm内存模型剖析优化-JVM(四)

上篇文章代码实例详解如何自定义双亲委派&#xff0c;主要实现ClassLoader&#xff0c;有两个方法&#xff0c;一个直接loadClass用父类的&#xff0c;如果想在破坏&#xff0c;则需要重写loadClass&#xff0c;一个findClass必须要重新&#xff0c;因为父类是空的&#xff0c;…

SpringBoot3之GraalVM之Linux详细安装及使用教程

Linux安装底层工具相关依赖 yum install -y gcc glibc-devel zlib-devel安装GraalVM JDK 《GraalVM官网下载》 找到最近的GraalVM Community Edition X.X.X点击Assets&#xff08;因为我的是SpringBoot3项目&#xff0c;起始JDK就要求17&#xff0c;所以我下载17&#xff09;下…

青少年机器人技术一级核心知识点:机械结构及模型(一)

随着科技的不断进步&#xff0c;机器人技术已经成为了一个重要的领域。在这个领域中&#xff0c;机械结构是机器人设计中至关重要的一部分&#xff0c;它决定了机器人的形态、运动方式和工作效率。对于青少年机器人爱好者来说&#xff0c;了解机械结构的基础知识&#xff0c;掌…

vim背景颜色设置

cd ~进入个人家目录下&#xff0c;vim .vimrc进入vimrc文件&#xff1a; 在主题设置部分对颜色背景进行设置&#xff0c;onedark表示黑色背景&#xff0c;default表示白色背景&#xff0c;按需设置即可&#xff01;

网络知识点-链路聚合

链路聚合&#xff08;英语&#xff1a;Link Aggregation&#xff09;是一个计算机网络术语&#xff0c;指将多个物理端口汇聚在一起&#xff0c;形成一个逻辑端口&#xff0c;以实现出/入流量吞吐量在各成员端口的负荷分担&#xff0c;交换机根据用户配置的端口负荷分担策略决定…

【数据结构】算法的时间和空间复杂度

目录 1.什么是算法&#xff1f; 1.1算法的复杂度 2.算法的时间复杂度 2.1 时间复杂度的概念 计算Func1中count语句总共执行了多少次 2.2 大O的渐进表示法 2.3常见时间复杂度计算举例 实例1:执行2N10次 实例2:执行MN次 实例3:执行了100000000次 实例4:计算strchr的时…

java jwt生成token并在网关设置全局过滤器进行token的校验并在给请求头设置参数及在微服务中解析参数

1、首先引入jjwt的依赖 <dependency><groupId>io.jsonwebtoken</groupId><artifactId>jjwt</artifactId><version>0.9.1</version> </dependency>2、编写生成token的工具类 package com.jjw.result.util;import com.jjw.res…

软考高级系统架构设计师(九) 作文模板-论设计模式及其应用(未完待续)

目录 掌握的知识点 创建型 结构型 行为型 掌握的知识点 设计模式分为哪3类 每一类包含哪些具体的设计模式 创建型 创建型模式是对对象实例化过程的抽象&#xff0c;他通过抽象类所定义的接口&#xff0c;封装了系统中对象如何创建、组合等信息。 创建型模式主要用于创建对…

【物联网】微信小程序接入阿里云物联网平台

微信小程序接入阿里云物联网平台 一 阿里云平台端 1.登录阿里云 阿里云物联网平台 点击进入公共实例&#xff0c;之前没有的点进去申请 2.点击产品&#xff0c;创建产品 3.产品名称自定义&#xff0c;按项目选择类型&#xff0c;节点类型选择之恋设备&#xff0c;联网方式W…

Linux下安装Redis的详细安装步骤

一.Redis安装 1.下载linux压缩包 【redis-5.0.5.tar.gz】 2.通过FlashFXP把压缩包传送到服务器 3.解压缩 tar -zxvf redis-5.0.5.tar.gz4.进入redis-5.0.5可以看到redis的配置文件redis.conf 5.基本的环境安装 使用gcc -v 命令查看gcc版本已经是4.8.5了&#xff0c;于是就…

ubuntu系统突然失去网络问题

修复ubuntu系统网络问题 1. 服务不存在&#xff1f;2. 修改配置&#xff0c;自动启动网络 每天都在用的ubuntu系统突然ssh连接不上&#xff0c;进系统ifconfig也不显示ip。当然也ping不通任何网页。 1. 服务不存在&#xff1f; 初步怀疑网络服务被关闭了&#xff0c;需要修改配…

【C6】数据类型/移植/对齐,内核中断,通过IO内存访问外设,PCI

文章目录 1.内核基础数据类型/移植性/数据对齐&#xff1a;页大小为PAGE_SIZE&#xff0c;不要假设4K&#xff0c;保证可移植性1.1 kdatasize.c&#xff1a;不同的架构&#xff08;x86_64,arm&#xff09;&#xff0c;基础类型大小可能不同&#xff0c;主要区别在long和指针1.2…

chatgpt赋能python:用Python访问数据库的SEO文章

用Python访问数据库的SEO文章 在当今互联网飞速发展的时代&#xff0c;数据处理和数据库技术的重要性不言而喻。在这些应用中&#xff0c;Python是使用最广泛和最受欢迎的编程语言之一。Python的简单和易学性使其成为理想的选项&#xff0c;可以通过Python来访问各种类型的数据…

荣耀90推出最新MagicOS7.1更新,增加控制中心功能

荣耀 90 系列机型推出了最新的 Magic OS 7.1更新&#xff0c;版本号为7.1.0.137 (C00E130R2P2)。该更新主要增加了控制中心功能&#xff0c;并对部分场景拍摄效果进行了优化。此外&#xff0c;该更新还提升了系统与部分三方应用的兼容性&#xff0c;以提高系统性能和稳定性。 …

选择最适合您自动化系统的控制方式

自动化系统可采用多种不同的控制方式&#xff0c;其中硬件控制和PLC&#xff08;可编程逻辑控制器&#xff09;是常见的选择。 刚好&#xff0c;我这里有上位机入门&#xff0c;学习线路图&#xff0c;各种项目&#xff0c;需要留个6。 硬件控制通常指使用专用硬件电路实现控…

C++3(sizeof和逗号运算符,类型转换)

1.sizeof的用法 逗号运算符 口诀&#xff1a;从左到右算&#xff0c;返回最右边的值 类型转换 如何实现的隐式类型转换&#xff1f; 先算右边的&#xff0c;右边的3&#xff08;int&#xff09;先提升为double &#xff0c;然后算得&#xff08;7.541&#xff08;double&#…

CMU 15-445 -- 关系型数据库重点概念回顾 - 01

CMU 15-445 -- 关系型数据库重点概念回顾 - 01 引言Relational Data ModelDBMS数据模型Relational ModelRelation & TuplePrimary KeysForeign Keys Data Manipulation Languages (DML)Relational Algebra Advanced SQLSQL 的历史SQLAggregatesGroup ByHavingOutput Redire…