Tomcat面试题

《林老师带你学编程》知识星球是由多个工作10年以上的一线大厂开发人员联合创建,希望通过我们的分享,帮助大家少走弯路,可以在技术的领域不断突破和发展。

🔥 具体的加入方式:

1. 你怎样给 tomcat 去调优?

1. JVM 参数调优: -Xms<size> 表示 JVM 初始化堆的大小, -Xmx<size>表示 JVM 堆的最  大值。这两个值的大小一般根据需要进行设置。当应用程序需要的内存超出堆的最大值时虚拟 机就会提示内存溢出,并且导致应用服务崩溃。因此一般建议堆的最大值设置为可用内存的最 大值的 80%。在 catalina.bat 中,设置 JAVA_OPTS=\’-Xms256m -Xmx512m\’,表示初始化

内存为 256MB,可以使用的最大内存为 512MB。

2. 禁用 DNS 查询

当 web 应用程序向要记录客户端的信息时,它也会记录客户端的 IP 地址或者通过域名服务 器查找机器名转换为 IP 地址。 DNS 查询需要占用网络,并且包括可能从很多很远的服务器或  者不起作用的服务器上去获取对应的 IP 的过程,这样会消耗一定的时间。为了消除 DNS 查询 对性能的影响我们可以关闭 DNS 查询,方式是修改 server.xml 文件中的 enableLookups 参

数值:

Tomcat4

<Connector className=\"org.apache.coyote.tomcat4.CoyoteConnector\"
           port=\"80\"
           minProcessors=\"5\"
           maxProcessors=\"75\"
           enableLookups=\"false\"
           redirectPort=\"8443\"
           acceptCount=\"100\"
           debug=\"0\"
           connectionTimeout=\"20000\"
           useURIValidationHack=\"false\"
           disableUploadTimeout=\"true\" />

Tomcat5

<Connector port=\"80\"
           maxThreads=\"150\"
           minSpareThreads=\"25\"
           maxSpareThreads=\"75\"
           enableLookups=\"false\"
           redirectPort=\"8443\"
           acceptCount=\"100\"
           debug=\"0\"
           connectionTimeout=\"20000\"
           disableUploadTimeout=\"true\" />

3. 调整线程数

通过应用程序的连接器(Connector)进行性能控制的的参数是创建的处理请求的线程数。

Tomcat 使用线程池加速响应速度来处理请求。在 Java 中线程是程序运行时的路径,是在一个 程序中与其它控制线程无关的、能够独立运行的代码段。它们共享相同的地址空间。多线程帮

助程序员写出 CPU 最大利用率的高效程序,使空闲时间保持最低,从而接受更多的请求。

Tomcat4 中可以通过修改 minProcessors 和 maxProcessors 的值来控制线程数。这些值

在安装后就已经设定为默认值并且是足够使用的,但是随着站点的扩容而改大这些值。

minProcessors 服务器启动时创建的处理请求的线程数应该足够处理一个小量的负载。也就是 说,如果一天内每秒仅发生 5 次单击事件,并且每个请求任务处理需要 1 秒钟,那么预先设置

线程数为 5 就足够了。但在你的站点访问量较大时就需要设置更大的线程数,指定为参数

maxProcessors 的值。 maxProcessors 的值也是有上限的,应防止流量不可控制(或者恶意  的服务攻击),从而导致超出了虚拟机使用内存的大小。如果要加大并发连接数,应同时加大

这两个参数。web server 允许的最大连接数还受制于操作系统的内核参数设置,通常

Windows 是 2000 个左右,Linux 是 1000 个左右。

在 Tomcat5 对这些参数进行了调整,请看下面属性:

maxThreads    Tomcat 使用线程来处理接收的每个请求。这个值表示 Tomcat 可创建的最大

的线程数。

acceptCount    指定当所有可以使用的处理请求的线程数都被使用时,可以放到处理队列中的

请求数,超过这个数的请求将不予处理。

connnectionTimeout    网络连接超时,单位:毫秒。设置为 0 表示永不超时,这样设置有隐

患的。通常可设置为 30000 毫秒。

minSpareThreads    Tomcat 初始化时创建的线程数。

maxSpareThreads     一旦创建的线程超过这个值,Tomcat 就会关闭不再需要的 socket 线

程。

最好的方式是多设置几次并且进行测试,观察响应时间和内存使用情况。在不同的机器、 操作系统或虚拟机组合的情况下可能会不同,而且并不是所有人的 web 站点的流量都是一样

的,因此没有一刀切的方案来确定线程数的值。

2. 如何加大 tomcat 连接数

在 tomcat 配置文件 server.xml 中的<Connector/>配置中,和连接数相关的参数有:

minProcessors:最小空闲连接线程数,用于提高系统处理性能,默认值为 10

maxProcessors:最大连接线程数,即:并发处理的最大请求数,默认值为 75

acceptCount:允许的最大连接数,应大于等于 maxProcessors,默认值为 100

enableLookups:是否反查域名,取值为:true 或 false。为了提高处理能力,应设置为 false

connectionTimeout:网络连接超时,单位:毫秒。设置为 0 表示永不超时,这样设置有隐患

的。通常可设置为 30000 毫秒。

其中和最大连接数相关的参数为 maxProcessors 和 acceptCount。如果要加大并发连接数,

应同时加大这两个参数。

web server 允许的最大连接数还受制于操作系统的内核参数设置,通常 Windows 是 2000 个

左右,Linux 是 1000 个左右。 tomcat5 中的配置示例:

<Connector port=\"8080\"
           maxThreads=\"150\"
           minSpareThreads=\"25\"
           maxSpareThreads=\"75\"
           enableLookups=\"false\"
           redirectPort=\"8443\"
           acceptCount=\"100\"
           debug=\"0\"
           connectionTimeout=\"20000\"
           disableUploadTimeout=\"true\" />

对于其他端口的侦听配置,以此类推。

3. tomcat 中如何禁止列目录下的文件

在{tomcat_home}/conf/web.xml 中,把 listings 参数设置成 false 即可,如下:

<init-param>
    <param-name>listings</param-name>
    <param-value>false</param-value>
</init-param>
<init-param>
    <param-name>listings</param-name>
    <param-value>false</param-value>
</init-param>

4.怎样加大 tomcat 的内存。

首先检查程序有没有限入死循环

这个问题主要还是由这个问题 java.lang.OutOfMemoryError: Java heap space  引起的。第一次出现这样 的的问题以后,引发了其他的问题。在网上一查可能是 JAVA 的堆栈设置太小的原因。

跟据网上的答案大致有这两种解决方法:

1、设置环境变量

解决方法:手动设置 Heap size

修改 TOMCAT_HOME/bin/catalina.sh

set JAVA_OPTS= -Xms32m -Xmx512m

可以根据自己机器的内存进行更改。

2、java -Xms32m -Xmx800m className

就是在执行 JAVA 类文件时加上这个参数,其中 className 是需要执行的确类名。(包括包名) 这个解决问题了。而且执行的速度比没有设置的时候快很多。

如果在测试的时候可能会用 Eclispe 这时候就需要在 Eclipse ->run -arguments  中的 VM arguments  中输 入-Xms32m -Xmx800m 这个参数就可以了。

后来在 Eclilpse 中修改了启动参数,在 VM arguments  加入了-Xms32m -Xmx800m,问题解决。

一、java.lang.OutOfMemoryError: PermGen space

PermGen space 的全称是 Permanent Generation space,是指内存的永久保存区域,

这块内存主要是被 JVM 存放 Class 和 Meta 信息的,Class 在被 Loader 时就会被放到 PermGen space 中, 它和存放类实例(Instance)的 Heap 区域不同,GC(Garbage Collection)不会在主程序运行期对PermGen space 进行清理,所以如果你的应用中有很多 CLASS 的话,就很可能出现 PermGen space 错误,这种错误常见在 web 服务器对 JSP 进行 pre compile 的时候。如果你的 WEB APP下都用了大量的第三 方 jar, 其大小超过了 jvm 默认的大小(4M)那么就会产生此错误信息了。

解决方法:  

  • 手动设置 MaxPermSize 大小
  • 修改 TOMCAT_HOME/bin/catalina.sh
  • 在“echo \”Using CATALINA_BASE:   $CATALINA_BASE\””上面加入以下行:
  • JAVA_OPTS=\”-server -XX:PermSize=64M -XX:MaxPermSize=128m

建议:将相同的第三方 jar 文件移置到 tomcat/shared/lib 目录下,这样可以达到减少 jar 文档重复占用内 存的目的。

二、 java.lang.OutOfMemoryError: Java heap space

查看更多

滚动至顶部