Tomcat性能调优

news2025/1/16 1:45:54

1‍.应用场景/常见内容溢出问题‍

常见问题为内存溢出,分为堆内存溢出、非堆内存溢出,比较常见的为堆内存溢出,后2类属于非堆内存溢出。

堆溢出:
java.lang.OutOfMemoryError:Java heap spcace
原因:项目运行阶段,new的对象过多,撑满了配置的最大内存,会出现该错误
解决方法:手动设置Xms ,Xmx 的大小.堆的最大值设置为物理可用内存的最大值的80%

栈溢出:
java.lang.StackOverflowError
原因:通常都是某个代码逻辑递归层次太多导致的,
解决方法:修改递归代码,控制递归层数

方法区溢出:
java.lang.OutOfMemoryError:PermGen space
原因:开发的项目Java文件比较多的时候,会出现该错误(即项目很大,被JVM加载的文件很多)
解决方法:手动设置MaxPermSize大小.

2.虚拟内存JVM设置

内存大小的单位可以是m或者G,一般将初始值与最大值设置为一样,避免频繁调整内存分配而浪费系统资源。
设置堆的大小是非常重要的,不能太小哦啊,也不能太大。
Linux下Tomcat的JVM设置:
catalina.sh中,位置cygwin=false前,增加

JAVA_OPTS="$JAVA_OPTS -server -Xms92G -Xmx92G -XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=$CATALINA_HOME/logs/heap.dump"

内存设置说明
堆内存设置:

-Xms 初始堆大小。如:-Xms256m或2G,默认为物理内存1/64。

-Xmx 最大堆大小。如:-Xmx512m或2G,默认为物理内存1/4。

非堆内存设置:

-XX:PermSize 永久代(方法区)的初始大小,默认为物理内存1/64。

-XX:MaxPermSize 永久代(方法区)的最大值,默认为物理内存1/4。

3、jvm的内存区域

java8的堆,有Eden、from、to、old四部分组成。组成比例是Eden:from :to = 8:1:1
新生代=Eden+from+to。老年代:新生代 = 2 : 1
在这里插入图片描述

总结下对象分配策略:
大多数情况下,对象在新生代 Eden 区中分配。当 Eden 区没有足够空间分配时,虚拟机将发起一次 Minor GC。

经过 Minor GC 后仍然存活,并且能被 Survivor 容纳的话,将被移动到 Survivor 空间中,并将对象年龄设为 1,对象在 Survivor区中每熬过一次 Minor GC,年龄就增加 1,当它的年龄增加到一定程度(并发的垃圾回收器默认为 15),CMS 是 6 时,就会被晋升到老年代中。

大对象直接进入老年代。HotSpot 虚拟机提供了-XX:PretenureSizeThreshold 参数,指定大于该设置值的对象直接在老年代分配,这样做的目的就是避免在 Eden 区及两个 Survivor区之间来回复制,产生大量的内存复制操作。

4、内存设置说明

优化连接数,主要是在conf/server.xml配置文件中进行修改

4.1、优化线程数

找到Connector port=“8080” protocol=“HTTP/1.1”,增加maxThreads和acceptCount属性(使acceptCount大于等于maxThreads),如下:
<Connector port=“8080” protocol="HTTP/1.1"connectionTimeout=“20000” redirectPort="8443"acceptCount=“500” maxThreads=“400” />
其中:
• maxThreads:tomcat可用于请求处理的最大线程数,默认是200
• minSpareThreads:tomcat初始线程数,即最小空闲线程数
• maxSpareThreads:tomcat最大空闲线程数,超过的会被关闭
• acceptCount:当所有可以使用的处理请求的线程数都被使用时,可以放到处理队列中的请求数,超过这个数的请求将不予处理.默认100

问题?
如果系统同时大概300人使用,设置多少合适,maxThreads 、minSpareThreads、acceptCount、connectionTimeout?
当系统需要支持大约 300 个用户同时使用时,可以根据系统的负载情况和性能需求来配置 Tomcat 的相关参数。以下是一些建议的配置:

  1. maxThreads:对于支持大约 300 个用户的系统,可以考虑将 maxThreads 设置为 400 到 500 之间。这样可以确保系统具有足够的线程来处理用户请求,同时留有一定的缓冲以应对突发高峰。

  2. minSpareThreadsminSpareThreads 参数用于定义线程池中保持活动状态的最小线程数。建议设置为一个较小的值,例如 50 到 100,以确保在低负载情况下仍然有一定数量的线程可用。

  3. acceptCountacceptCount 参数用于定义等待处理的连接请求的最大队列长度。对于支持大量用户的系统,可以将 acceptCount 设置得稍微高一些,例如 200 或 300,以减少因瞬时爆发连接请求而导致的连接超时。

  4. connectionTimeoutconnectionTimeout 参数定义了连接的超时时间,即连接在空闲多久后被关闭。可以根据系统的网络延迟和用户操作响应时间来设置合适的值,一般建议设置为几分钟到十几分钟之间。

综上所述,针对支持大约 300 个用户同时使用的系统,可以将 maxThreads 设置为 400 到 500,minSpareThreads 设置为 50 到 100,acceptCount 设置为 200 到 300,connectionTimeout 根据具体情况设置合适的超时时间。最终的配置参数取决于系统的具体需求和实际情况,可以通过监控系统性能和进行压力测试来进一步优化参数设置。

4.2、使用线程池

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

<Executor name="tomcatThreadPool" namePrefix="req-exec-"maxThreads="1000" minSpareThreads="50"maxIdleTime="60000"/>
<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 查看每个用户允许打开的最大文件数

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

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

相关文章

ubuntu18.04下创建新用户

进入root用户 su - 创建用户 useradd -mr -s /bin/bash minios 参数 r:创建系统账户m:自动在/home目录下创建用户目录s:指定用户登入后使用的shell为/bin/shell minios为自定义的用户名 如果直接用useradd添加用户的话&#xff0c;可能出现没有home下的文件夹&#xff0c…

C语言指针总结(完结篇)

前言 这篇博客终于迎来了指针博客的大结局&#xff0c;本篇主要分析习题来回顾之前的指针总结的知识点&#xff0c;这篇博客的题有点绕&#xff0c;哈哈算是经典了 个人主页&#xff1a;小张同学zkf 若有问题 评论区见 感兴趣就关注一下吧 目录 1. sizeof和strlen的对比 1.1 …

ROS2学习(七) Foxy版本ros2替换中间件。

在ros2使用的过程中&#xff0c;一开始选用的foxy版本&#xff0c;后来发现&#xff0c;foxy版本的ros2有很多问题。一个是foxy版本已经停止维护了。另一个问题是这个版本有很多bug, 后续的版本在功能实现上做了很大的改动&#xff0c;甚至说进行了重写。修复的一些问题&#x…

Sora正在颠覆游戏行业,CEO们该怎么应对?

文 | 魏力 发布 | 大力财经 摘要&#xff1a;AI 提升游戏制作效率&#xff0c;带来多样化和技术突破。在 AI 为游戏行业带来新机遇的时代&#xff0c;游戏公司应如何把握&#xff1f; 随着ChatGPT技术的快速发展&#xff0c;游戏行业正迎来一场AI技术变革。AI技术的应用为游…

长沙银行数字化案例入选《2024IDC中国金融业数据资产管理实践与案例报告》

全球数字化经济浪潮下&#xff0c;以数字技术为代表的的新一轮技术变革正跨步引领经济发展趋势。中国金融业作为2026年底数据要素应用总体目标所聚焦的十二个行业和领域之一&#xff0c;金融业数据资产管理成功经验正逐步被探索应用。 近日&#xff0c;全球权威知名市场调研机构…

开源的前端思维导图库介绍

在开源社区中&#xff0c;有许多优秀的思维导图库可供开发者使用。这些库通常具有丰富的功能和灵活的API&#xff0c;可以满足不同需求的前端开发。以下是一些流行的开源前端思维导图库&#xff0c;以及它们的特点和区别。 1. **MindMap** 特点&#xff1a; - 基于原生…

神经网络算法——反向传播 Back Propagation

文章目录 前言 1、反向传播的本质 &#xff08;1&#xff09;前向传播&#xff08;Forward Propagation&#xff09; &#xff08;2&#xff09;反向传播&#xff08;Back Propagation&#xff09; 2、反向传播的原理 &#xff08;1&#xff09;链式法则&#xff08;Chain Rule…

arm架构服务器使用Virtual Machine Manager安装的kylin v10虚拟机

本文中使用Virtual Machine Manager安装kylin v10的虚拟机 新建虚拟机 新建虚拟机 选择镜像&#xff0c;下一步 设置内存和CPU&#xff0c;下一步 选择或创建自定义存储&#xff08;默认存储位置的磁盘空间可能不够用&#xff09; 点击管理&#xff0c;打开选择存储卷页…

“轻松掌握财务状况:智能筛选银行卡收支明细,一键统计总花销”

在快节奏的现代生活中&#xff0c;财务管理成为我们日常的重要任务。你是否经常为了查看银行卡账户的收支明细而烦恼&#xff1f;是否想要快速统计出账户的总花销&#xff0c;以便更好地掌握自己的财务状况&#xff1f;现在&#xff0c;我们为你带来了一款全新的财务管理工具&a…

校招中的“熟悉linux操作系统”一般是指达到什么程度?

校招中的“熟悉linux操作系统”一般是指达到什么程度&#xff1f; 在开始前我有一些资料&#xff0c;是我根据网友给的问题精心整理了一份「Linux的资料从专业入门到高级教程」&#xff0c; 点个关注在评论区回复“888”之后私信回复“888”&#xff0c;全部无偿共享给大家&am…

【unity小技巧】Unity人物衣服布料系统的探究 —— Cloth组件

文章目录 一、Cloth组件解释基本介绍出于性能的考虑, 可以对Cloth产生影响的Collider只有两种打开编辑模式绘制 二、基本使用1. 创建出一个空物体2. 在空物体上添加cloth组件&#xff0c;可以直接点击Add Component搜索cloth添加&#xff0c;也可以在工具栏 Component–>phy…

动态规划(算法竞赛、蓝桥杯)--树形DP树的中心

1、B站视频链接&#xff1a;E34 树形DP 树的中心_哔哩哔哩_bilibili #include <bits/stdc.h> using namespace std; const int N20010; int n,a,b,c,ans2e9; struct edge{int v,w;}; vector<edge> e[N]; int d1[N],d2[N],path[N],up[N];//path记录d1 void dfs1(in…

【Datawhale组队学习:Sora原理与技术实战】

Transformersdiffusion技术背景简介 Transformers diffusion背景 近期大火的OpenAI推出的Sora模型&#xff0c;其核心技术点之一&#xff0c;是将视觉数据转化为Patch的统一表示形式&#xff0c;并通过Transformers技术和扩散模型结合&#xff0c;展现了卓越的scale特性。 被…

iStoreOS系统-HomeAssistant服务下载安装HACS

iStoreOS系统-HomeAssistant服务下载安装HACS 1. HACS HACS&#xff08;Home Assistant Community Store&#xff09;是Home Assistant的一个插件商店&#xff0c;它允许用户轻松地浏览、安装和管理各种为Home Assistant开发的自定义插件和集成。通过HACS&#xff0c;用户可以…

Linux Ubuntu系统安装MySQL并实现公网连接本地数据库【内网穿透】

文章目录 前言1 .安装Docker2. 使用Docker拉取MySQL镜像3. 创建并启动MySQL容器4. 本地连接测试4.1 安装MySQL图形化界面工具4.2 使用MySQL Workbench连接测试 5. 公网远程访问本地MySQL5.1 内网穿透工具安装5.2 创建远程连接公网地址5.3 使用固定TCP地址远程访问 前言 本文主…

创新驱动!HubSpot引领CRM革命

在当今高速发展的数字化时代&#xff0c;企业的国际化布局和市场开拓已经成为了一种必然的趋势。随着企业出海步伐的加快&#xff0c;有效的客户关系管理&#xff08;CRM&#xff09;和营销自动化工具变得尤为重要。这就是HubSpot发力的领域。HubSpot&#xff0c;作为一家领先的…

【MATLAB】 CEEMD信号分解+FFT傅里叶频谱变换组合算法

有意向获取代码&#xff0c;请转文末观看代码获取方式~ 展示出图效果 1 CEEMD信号分解算法 CEEMD 分解又叫互补集合经验模态分解&#xff0c;英文全称为 Complementary Ensemble Empirical Mode Decomposition。 CEEMD是对EEMD的改进&#xff0c;它在EEMD的基础上引入了一个…

CRichEditUI中文乱码问题(Duilib)

这是遇到问题的时候&#xff0c;我还以为是韩文 解决方案&#xff1a; //HMODULE hmod LoadLibrary(_T("msftedit.dll"));HMODULE hmod LoadLibrary(_T("riched20.dll"));//修改一下使用的动态库&#xff0c;兼容性问题需要自己测

[HackMyVM]靶场 Wild

kali:192.168.56.104 主机发现 arp-scan -l # arp-scan -l Interface: eth0, type: EN10MB, MAC: 00:0c:29:d2:e0:49, IPv4: 192.168.56.104 Starting arp-scan 1.10.0 with 256 hosts (https://github.com/royhills/arp-scan) 192.168.56.1 0a:00:27:00:00:05 …

【MySQL】用户管理 -- 详解

如果我们只能使用 root 用户&#xff0c;这样存在安全隐患。这时就需要使用 MySQL 的用户管理。 一、 用户 1、用户信息 MySQL 中的用户都存储在系统数据库 MySQL 的 user 表中。 字段解释&#xff1a; host&#xff1a;表示这个用户可以从哪个主机登陆&#xff0c;如果…