Tomcat 通常是JavaWeb开发中默认的开发环境,但是Tomcat的默认配置在作为生产环境时,很难满足我们的需求,很多方面都是可以优化的,尤其是内存和线程的配置,默认都很低。
下面结合资料和实际工作中的情况,从内存、并发、缓存、IO四个方面分析下优化的方法。
一、Tomcat内存优化
内存优化,也就是对JVM的参数进行优化,优化的文件是
Windows 操作系统下的catalina.bat 和 Linux 操作系统下的catalina.sh,主要是对其中的 java_OPTS 参数 设置:
JAVA_OPTS参数说明 :
-server: 启用jdk 的 server 版;
-Xms: java虚拟机初始化时的最小内存,JVM初始化堆的大小;
-Xmx: java虚拟机可使用的最大内存,JVM堆的最大值;
-XX: PermSize 内存永久保留区域
-XX: MaxPermSize 内存最大永久保留区域
现公司服务器内存一般都可以加到最大2G ,所以可以采取以下配置:
JAVA_OPTS=’-Xms1024m -Xmx2048m -XX: PermSize=256M -XX:MaxNewSize=256m -XX:MaxPermSize=256m’
配置完成后重启Tomcat ,通过以下命令进行查看配置是否生效:
(1)首先查看Tomcat 进程号:
sudo lsof -i:9027
可以看到Tomcat 进程号是 12222
(2)查看是否配置生效:
sudo jmap – heap 12222
可以看到MaxHeapSize 等参数已经生效
二、Tomcat并发优化
1.Tomcat连接相关参数
在Tomcat 配置文件 server.xml 中的
(1)参数说明
maxThreads 客户请求最大线程数 ,即最多同时处理X个连接
minSpareThreads Tomcat 初始化时创建的 socket 线程数 ,初始化X个连接
maxSpareThreads Tomcat 连接器的最大空闲 socket 线程数 ,表示如果最多可以有X个线程,一旦超过X个,则会关闭不在需要的线程
enableLookups 若设为true, 则支持域名解析,可把 ip 地址解析为主机名
redirectPort 在需要基于安全通道的场合,把客户请求转发到基于SSL 的 redirectPort 端口
acceptAccount 监听端口队列最大数,满了之后客户请求会被拒绝同时不能小于maxSpareThreads数
connectionTimeout 连接超时
minProcessors 服务器创建时的最小处理线程数
maxProcessors 服务器同时最大处理线程数
URIEncoding URL统一编码
(2)配置示例
minProcessors="100" maxProcessors="1000" enableLookups="false"
URIEncoding="utf-8" acceptCount="1000" redirectPort="8443"
disableUploadTimeout="true"/>
三、Tomcat缓存优化
(1)参数说明
compression 打开压缩功能
compressionMinSize 启用压缩的输出内容大小,这里面默认为2KB
compressableMimeType 压缩类型
connectionTimeout 定义建立客户连接超时的时间. 如果为 -1, 表示不限制建立客户连接的时间
(2)配置示例
minProcessors="100" maxProcessors="1000" enableLookups="false"
compression="on" compressionMinSize="2048"
compressableMimeType="text/html,text/xml,text/javascript,text/css,text/plain"
connectionTimeout="20000" URIEncoding="utf-8" acceptCount="1000"
redirectPort="8443" disableUploadTimeout="true"/>
四、Tomcat IO优化
Tomcat通讯协议支持http1.0和1.1,默认走的是BIO通讯模式
顺便熟悉下Java中对几种IO方式:
Java BIO : 同步并阻塞,服务器实现模式为一个连接一个线程,即客户端有连接请求时服务器端就需要启动一个线程进行处理,如果这个连接不做任何事情会造成不必要的线程开销,当然可以通过线程池机制改善。
Java NIO : 同步非阻塞,服务器实现模式为一个请求一个线程,即客户端发送的连接请求都会注册到多路复用器上,多路复用器轮询到连接有I/O请求时才启动一个线程进行处理。
Java AIO(NIO.2) : 异步非阻塞,服务器实现模式为一个有效请求一个线程,客户端的I/O请求都是由OS先完成了再通知服务器应用去启动线程进行处理
Tomcat中IO优化的配置方法:
在server.xml中 ,将
改为:
其中的 protocol=”org.apache.coyote.http11.Http11NioProtocol” ,表示以 NIO模式启动。
参考文章:https://blog.csdn.net/centre10/article/details/50639693