Tomcat性能调优

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 查看每个用户允许打开的最大文件数

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Linux CentOS系统安装Spug并结合内网穿透实现远程访问本地运维平台

目录 前言 1. Docker安装Spug 2 . 本地访问测试 3. Linux 安装cpolar 4. 配置Spug公网访问地址 5. 公网远程访问Spug管理界面 6. 固定Spug公网地址 结语 作者简介&#xff1a; 懒大王敲代码&#xff0c;计算机专业应届生 今天给大家聊聊Linux CentOS系统安装Spug并结合…

Leetcode刷题(三十八)

旋转矩阵&#xff08;Medium&#xff09; 给定一个 n n 的二维矩阵 matrix 表示一个图像。请你将图像顺时针旋转 90 度。你必须在 原地 旋转图像&#xff0c;这意味着你需要直接修改输入的二维矩阵。请不要 使用另一个矩阵来旋转图像。示例 1&#xff1a;输入&#xff1a;mat…

Blazor系统教程(.net8)

Blazor系统教程 1.认识 Blazor 简单来讲&#xff0c;Blazor旨在使用C#来替代JavaScript的Web应用程序的UI框架。其主要优势有&#xff1a; 使用C#编写代码&#xff0c;这可提高应用开发和维护的效率利用现有的NET库生态系统受益于NET的性能、可靠性和安全性与新式托管平台(如…

MYSQL使用mysqldump备份、复原数据库

参考 添加链接描述 1. 备份数据库 C:\Windows\system32>mysqldump -uroot -p test student>C:\student.sql Enter password: ****2. 备份多个数据库 mysqldump -u root -p --databases test mysql>C:\testandmysql.sql3. 备份所有数据库 mysqldump -u root -p -…

二维码样式修改如何在线处理?在电脑上改二维码图案的方法

随着网络的不断发展&#xff0c;二维码的应用场景不断增多&#xff0c;很多人都会将内容放到二维码中&#xff0c;通过扫码的方式将储存在云端的数据调取显示。而面对不同的用途时&#xff0c;对二维码的样式也会有单独的要求&#xff0c;比如需要改变颜色、加入文字、logo、尺…

加油!你也可以成为学生口中的“好老师”

在教育的道路上&#xff0c;每一位教师都承载着塑造未来的重要使命。而成为学生口中的“好老师”&#xff0c;无疑是每位教育工作者的追求和荣耀。那么&#xff0c;如何才能成为这样的“好老师”呢&#xff1f; 一、热爱教育&#xff0c;关爱学生 成为“好老师”的首要条件是对…

神经网络(neural network)

在这一章中我们将进入深度学习算法&#xff0c;学习一些神经网络相关的知识&#xff0c;这些是有更加强大的作用&#xff0c;更加广泛的用途。 神经元和大脑(neurons and the brain): 我们对于我们的编程的进步主要来自我们对于大脑的研究&#xff0c;根据我们对于大脑的研究…

Vue系列-环境快速搭建

vue环境快速搭建 演示视频 快速搭建Vue开发环境pnpm和yarn 1. 基本信息 作者: GMCY系列: Vue仓库: GitHub | Gitee话题(GitHub): tools \ vue创建时间: 2024/03/02 2. 介绍 功能 批处理文件vue 环境的快速搭建nodejs, npm, pnpm, yarn 自动 下载安装npm, pnpm, yarn 自动 …

网络空间资产安全解决方案

长期以来&#xff0c;我们一直强调要做好网络安全建设&#xff0c;而其中的第一步就是要做好对自身资产的发现和清点&#xff0c;正如大家经常所说的那句话——“你无法保护你看不见的东西”。的确&#xff0c;如果不知道自己拥有什么资产&#xff0c;那么如何去了解与它们相关…

js 实现点击按钮小球加入购物车动画

本文旨在实现类似点击按钮实现小球加入购物车效果。 使用技术&#xff1a; Vue2使用 Pubsub 监听按钮点击事件&#xff08;如果不想用也可以自己改造下&#xff09;监听 onmousemove 来获取按钮点击时的鼠标位置 小球组件&#xff1a; html css&#xff1a; 小球父元素&am…

小心!Springer旗下34年老刊大量撤稿中国论文,16天见刊,中国人该如何应对?

毕业推荐 SCIE&#xff1a; • 计算机类&#xff0c;6.5-7.0&#xff0c;JCR1区&#xff0c;中科院2区 • 2个月19天录用&#xff0c;6天见刊&#xff0c;36天检索 SCI&EI&#xff08;CCF-C类&#xff09; • 算法类&#xff0c;2.0-3.0&#xff0c;JCR3区&#xff0c;…

ChatGPT提问技巧——标准提示

ChatGPT提问技巧——标准提示 标准提示是一种通过向模型提供一个具体要完成的任务&#xff0c;指导ChatGPT输出的简单方式。例如&#xff0c;如果你想生成一个新闻的总结&#xff0c;你要提供一个任务像这样的“总结一下这篇新闻文章“。 提示格式&#xff1a;”生成【任务】…

IoT数据采集网关在企业应用中扮演着关键角色-天拓四方

随着物联网&#xff08;IoT&#xff09;技术的不断发展&#xff0c;越来越多的企业开始利用IoT技术实现智能化、自动化的生产和管理。在这个过程中&#xff0c;IoT数据采集网关作为连接物理世界与数字世界的桥梁&#xff0c;发挥着至关重要的作用。 IoT数据采集网关是一种硬件…

LeetCode 2917.找出数组中的 K-or 值:基础位运算

【LetMeFly】2917.找出数组中的 K-or 值&#xff1a;基础位运算 力扣题目链接&#xff1a;https://leetcode.cn/problems/find-the-k-or-of-an-array/ 给你一个下标从 0 开始的整数数组 nums 和一个整数 k 。 nums 中的 K-or 是一个满足以下条件的非负整数&#xff1a; 只有…

横琴正式封关运行,惟客数据都做了什么?

​作为中国实施高水平制度型开放的重大探索&#xff0c;位于珠海横琴岛的横琴粤澳深度合作区于2024年3月1日零时正式实施分线管理封关运行&#xff0c;共设1个“一线”口岸、7个“二线”海关作业现场&#xff0c;覆盖旅检、货运、通关、稽&#xff08;核&#xff09;查等多线条…

第26章 模块

本章内容  理解模块模式  凑合的模块系统  使用前 ES6 模块加载器  使用 ES6 模块 现代 JavaScript 开发毋庸置疑会遇到代码量大和广泛使用第三方库的问题。解决这个问题的方案通常需要把代码拆分成很多部分&#xff0c;然后再通过某种方式将它们连接起来。 文章目录 …

MySQL基础-----函数

目录 前言 一、字符串函数 演示 案例 二、数值函数 演示 案例 三、日期函数 演示 案例 四、流程函数 演示 案例 前言 本期我们就开始MySQL中函数的学习。函数 是指一段可以直接被另一段程序调用的程序或代码。 也就意味着&#xff0c;这一段程序或代码在MySQL中 已经…

Linux之线程概念

目录 一、细粒度划分 1、堆区细粒度划分 2、物理内存和可执行程序细粒度划分 3、虚拟地址到物理地址的转化 二、线程的概念 1、基本概念 2、线程的优点 3、线程的缺点 4、线程异常 5、线程用途 三、Linux下的进程和线程 一、细粒度划分 1、堆区细粒度划分 在语言…

php安装kafka

我的开发环境是php7.3 ,先来部署两个php扩展&#xff0c;php7.3目录下放librdkafka.dll,ext/php_rdkafka.dll&#xff0c;php.ini增加,[rdkafka] extension php_rdkafka.dll php7.3对应的扩展包链接&#xff1a;PECL :: Package :: rdkafka 看自己php版本对应在这里找PECL :: …

antd vue 选择控件的使用

Ant Design Vue-------Select 选择器 今天就讲讲Ant Design Vue下的控件----select 下拉框 结合项目中的需求&#xff0c;讲一下该控件如何配置&#xff0c;需求&#xff1a; &#xff08;1&#xff09;设置控件的宽度和高度 &#xff08;2&#xff09;绑定数据源 &#x…