【高并发】高并发环境下如何优化Tomcat性能?看完我懂了!

article/2025/9/17 23:47:45

写在前面

Tomcat作为最常用的Java Web服务器,随着并发量越来越高,Tomcat的性能会急剧下降,那有没有什么方法来优化Tomcat在高并发环境下的性能呢?

Tomcat运行模式

Tomcat的运行模式有3种。

1.bio模式

默认的模式,性能非常低下,没有经过任何优化处理和支持。

2.nio模式

利用java的异步io护理技术,noblocking IO技术。要想运行在该模式下,则直接修改server.xml里的Connector节点,修改protocol为如下配置。

protocol="org.apache.coyote.http11.Http11NioProtocol"

重启Tomcat后,就可以生效。

3.apr模式

安装起来最困难,但是从操作系统级别来解决异步的IO问题,大幅度的提高性能。此种模式下,必须要安装apr和native,直接启动就支持apr。如nio修改模式,修改protocol为org.apache.coyote.http11.Http11AprProtocol,如下所示。

protocol="org.apache.coyote.http11.Http11AprProtocol"

Tomcat并发优化

安装APR

[root@binghe ~]# yum -y install apr apr-devel openssl-devel
[root@binghe ~]# tar zxvf tomcat-native.tar.gz
[root@binghe ~]# cd tomcat-native-1.1.24-src/jni/native
[root@binghe native]# ./configure --with-apr=/usr/bin/apr-1-config --with-ssl=/usr/include/openssl/
[root@binghe native]# make && make install

安装完成之后 会出现如下提示信息

Libraries have been installed in:
/usr/local/apr/lib

安装成功后还需要对tomcat设置环境变量,方法是在catalina.sh文件中增加1行:

在这段代码下面添加:

============
# OS specific support.  $var _must_ be set to either true or false.
cygwin=false
darwin=false
==============
CATALINA_OPTS=”-Djava.library.path=/usr/local/apr/lib”

修改server.xml的配置,如下所示。

protocol=”org.apache.coyote.http11.Http11AprProtocol”

启动tomcat之后,查看日志,如下所示。

more TOMCAT_HOME/logs/catalina.out
2020-04-17 22:34:56 org.apache.catalina.core.AprLifecycleListener init
INFO: Loaded APR based Apache Tomcat Native library 1.1.31 using APR version 1.3.9.
2020-04-17 22:34:56 org.apache.catalina.core.AprLifecycleListener init
INFO: APR capabilities: IPv6 [true], sendfile [true], accept filters [false], random [true].
2020-04-17 22:34:56 org.apache.catalina.core.AprLifecycleListener initializeSSL
INFO: OpenSSL successfully initialized (OpenSSL 1.0.1e 11 Feb 2013)
2020-04-17 22:34:58 AM org.apache.coyote.AbstractProtocol init
INFO: Initializing ProtocolHandler [“http-apr-8080”]
2020-04-17 22:34:58 AM org.apache.coyote.AbstractProtocol init
INFO: Initializing ProtocolHandler [“ajp-apr-8009”]
2020-04-17 22:34:58 AM org.apache.catalina.startup.Catalina load
INFO: Initialization processed in 1125 ms

Tomcat优化

1.JVM 调优

在TOMCAT_HOME/bin/catalina.sh 增加如下语句,具体数值视情况而定。
添加到上面CATALINA_OPTS的后面即可,如下所示。

JAVA_OPTS=-Xms512m -Xmx1024m -XX:PermSize=512M -XX:MaxNewSize=1024m -XX:MaxPermSize=1024m

参数详解

  • -Xms:JVM初始化堆内存大小。

  • -Xmx:JVM堆的最大内存。

  • -Xss:线程栈大小。

  • -XX:PermSize:JVM非堆区初始内存分配大小。

  • -XX:MaxPermSize:JVM非堆区最大内存。

建议和注意事项:

-Xms和-Xmx选项设置为相同堆内存分配,以避免在每次GC 后调整堆的大小,堆内存建议占内存的60%~80%;非堆内存是不可回收内存,大小视项目而定;线程栈大小推荐256k。

32G内存配置如下:

JAVA_OPTS=-Xms20480m -Xmx20480m -Xss1024K -XX:PermSize=512m -XX:MaxPermSize=2048m

2.关闭DNS反向查询

在<Connector port=”8080″ 中加入如下参数。

enableLookups=”false”

3.优化tomcat参数

在server.xml文件中进行如下配置。

<Connector port=”8080″
protocol=”org.apache.coyote.http11.Http11AprProtocol”
connectionTimeout=”20000″ //链接超时时长
redirectPort=”8443″
maxThreads=”500″//设定处理客户请求的线程的最大数目,决定了服务器可以同时响应客户请求的数,默认200
minSpareThreads=”20″//初始化线程数,最小空闲线程数,默认为10
acceptCount=”1000″ //当所有可以使用的处理请求的线程数都被使用时,可以被放到处理队列中请求数,请求数超过这个数的请求将不予处理,默认100
enableLookups=”false”
URIEncoding=”UTF-8″ />

写在最后

如果觉得文章对你有点帮助,请微信搜索并关注「 冰河技术 」微信公众号,跟冰河学习高并发编程技术。

最后,附上并发编程需要掌握的核心技能知识图,祝大家在学习并发编程时,少走弯路。
在这里插入图片描述


http://chatgpt.dhexx.cn/article/7nP38TxV.shtml

相关文章

Java-JVM-常用参数和调优方案(超保姆级)

Java-JVM-常用参数和调优方案 必须了解的内容 必须看过Java-JVM基础(调优必须知道)知道JVM大概的情况,这篇文章我博客里有 堆区&#xff08;Java堆&#xff1a;所有的线程共享该区域&#xff09; 通过new的方式创建的对象(一个类的实例)、数组所占的空间。 非堆区&#xff1a…

嵌入式知识图谱WiKi(嵌入式开发/研发入门教程和路线图)

嵌入式知识图谱WiKi 作者将狼才鲸创建时间2022-02-18 因图床更新不方便&#xff0c;最新版请跳转到Gitee文档源文件仓库网址 才鲸 / 嵌入式知识图谱WiKi CSDN有图的文档阅读网址 嵌入式知识图谱WiKi Bilibili视频讲解网址&#xff08;待完成&#xff09; 才鲸嵌入式主页 一、概…

select、poll和epoll

select、poll和epoll 对select、poll、epoll了解得不多&#xff0c;下面是从《构建高性能Web站点》摘录下来的介绍&#xff0c;等以后真正接触到select、poll和epoll方面的开发再详细写一下使用上的区别。 select select最早于1983年出现在4.2BSD中&#xff0c;它通过一个sele…

Mysql 和 Postgresql(PGSQL) 对比

Mysql 和 Postgresql(PGSQL) 对比 转载自&#xff1a;http://www.oschina.net/question/96003_13994 PostgreSQL与MySQL比较 MySQL使用太广泛了&#xff0c;以至于我不得不将一些应用从mysql 迁移到postgresql, 很多开源软件都是以Mysql 作为数据库标准&#xff0c;并且以Mysq…

JVM系列之常用参数的查看和设置

JVM常用参数 参数名称含义默认值说明-Xms初始堆大小&#xff0c;等价于-XX:InitialHeapSize物理内存的1/64默认(MinHeapFreeRatio参数可以调整)空余堆内存小于40%时&#xff0c;JVM就会增大堆直到-Xmx的最大限制.-Xmx最大堆大小&#xff0c;等价于-XX:MaxHeapSize物理内存的1/…

Tomcat内存调整和默认线程池调整

上线了很久的一个项目&#xff08;财政数据共享平台&#xff09;&#xff0c;由于领导要求&#xff0c;新来的同事就把新项目&#xff08;社保数据共享&#xff09;做在了该项目上&#xff0c;这就导致了许多的问题&#xff0c;先从日志说起&#xff0c;该同事把数据获取和传送…

lunix下修改tomcat的堆内存大小

修改tomcat的初始堆大小和最大堆大小 要添加在tomcat 的bin 下catalina.sh 里&#xff0c;位置cygwinfalse前 。注意引号要带上,红色的为新添加的. # OS specific support. $var _must_ be set to either true or false.JAVA_OPTS"-Xms256m -Xmx512m -Xss1024K -XX:Perm…

java对象内存布局和对象定位

目录 观察对象在内存中的存储布局 利用java agent 利用JOL工具 Java对象定位 直接指针寻址 间接寻址 JIT(Just In-Time Compiler&#xff09; c1、c2 编译线程 c1, c2编译器线程高CPU消耗 - 潜在的解决方案 使用字节码和汇编语言同步分析volatile&#xff0c;synchron…

【C/C++ 集成内存调试、内存泄漏检测和性能分析的工具 Valgrind 】Linux 下 Valgrind 工具的全面使用指南

目录标题 Valgrind 工具的安装 交叉编译Valgrind Valgrind 工具的作用Memcheck 内存泄漏检测工具常规检测&#xff08;程序结束后生成报告&#xff09;重要参数长时间运行的服务使报告输出至文件报告分析示例一分析\_示例一示例二分析\_示例二 Massif堆栈检测工具Massif的基本…

C/C++开发,无可避免的多线程(篇一).跨平台并发编程姗姗来迟

目录 一、编译环境准备 1.1 编译环境配置 1.2 先睹为快的c11多线程编程示例 二、c/c并发编程支持 2.1 进程与线程 2.2 c/c多线程的并发编程 2.3 c11以前的多线程支持 2.4 c11以后的多线程支持 2.5 线程与互斥锁 2.6 跨线程安全问题 三、认识c/c的thread 3.1 std::thread类 3…

windows利器之cygwin

好久没写文章了&#xff0c;诸事烦身&#xff0c;脱不开。。。 不想开虚拟机占内存&#xff0c;同时还想在windows下使用linux命令&#xff0c;那就是cygwin了 第一部分 去官网下一个exe https://cygwin.com/install.html 直接运行&#xff0c; 基本都是默认&#xff0c; …

spi时序图怎么分析,怎么看懂spi时序图

我做产品的时候&#xff0c;最怕就是做IIC和SPI的通信。 这两种协议时序哪怕是延时时间有误差&#xff0c;都有可能导致通信不上。 出现问题的时候&#xff0c;如果没设备也很难排查问题到底出在哪里。 有时候这个产品写好的时序程序&#xff0c;换一个单片机用同一个程序移植过…

怎么看懂单片机时序图?

本人没有上过单片机相关的专业课&#xff0c;是在《计算机系统结构》里遇见的时序图。由于看不懂加之老师没有专门讲&#xff0c;因此自行查阅了相关的视频和博客。&#xff08;参考视频已放在文末&#xff09; 网上资源贫瘠&#xff0c;不过我也不需要太过深入的知识。 大家…

UML系列——时序图(顺序图)

引言 用例图、类图、活动图、时序图之间是什么关系&#xff1f; 时序图有什么作用&#xff1f; 先来模拟一下三国演义的赤壁之战的时序图&#xff0c;先知道它到底长什么样子&#xff0c;再深入介绍&#xff1a; 小伙伴惊呆了&#xff0c;这样画战略图&#xff0c;一目了然&…

UML图之五——时序图

一、什么是时序图 序列图表示了系统在参与者互动执行某一个用例期间,系统内部的一群对象的协作情况。一个用例就对应一个时序图。序列图是对系统动态行为进行描述。用于用例分析和设计阶段。 二、对比 1、序列图和协作图 序列图跟协作图相似,两种图传递的意思是一样的。不…

浅谈时序图

前序&#xff1a; 这周基本都在肝txmini项目&#xff0c;不知道是不是我菜&#xff0c;总觉得难度还是挺高的&#xff0c;所以就没太多时间整理知识点了。 项目进展了快大半个月了&#xff0c;最后因为性能问题&#xff0c;我们还是选择重构原来的代码。准备用golang去重构原本…

读懂时序图

UML建模之时序图&#xff08;Sequence Diagram&#xff09; 时序图简介&#xff08;Brief introduction&#xff09;时序图元素&#xff08;Sequence Diagram Elements&#xff09; 角色&#xff08;Actor&#xff09;对象&#xff08;Object&#xff09;生命线&#xff08;Li…

时序图的概念

一. 时序图 (Sequence Diagram) 时序图 : 显示对象之间的关系, 强调对象之间消息的时间顺序, 显示对象之间的交互; 时序图是一个二维图&#xff0c;横轴表示对象&#xff0c;纵轴表示时间&#xff0c;消息在各对象之间横向传递&#xff0c;依照时间顺序纵向排列。 1.时序图的…

UML之时序图详解

作者 : 万境绝尘 转载请注明出处 : http://blog.csdn.net/shulianghan/article/details/17927131 动态图概念 : 从静态图中抽取瞬间值的变化描述系统随时间变化的行为, 动态图包括交互图活动图状态图, 这篇博客研究交互图 包括时序图和协作图; – 时序图 : 显示对象之间的关…

时序图简介

什么是时序图 来自百度百科的介绍&#xff1a; “又名序列图、循序图&#xff0c;是一种UML交互图。它通过描述对象之间发送消息的时间顺序显示多个对象之间的动态协作。它可以表示用例的行为顺序&#xff0c;当执行一个用例行为时&#xff0c;其中的每条消息对应一个类操作或…