Tomcat调优

文章目录

      • 内存大小
      • 容器的优化

内存大小

​ 默认大小:命令 jmap -heap pid

	jmap -heap pid部分值:
Heap Configuration:MinHeapFreeRatio         = 0MaxHeapFreeRatio         = 100MaxHeapSize              = 2063597568 (1968.0MB)NewSize                  = 42991616 (41.0MB)MaxNewSize               = 687865856 (656.0MB)OldSize                  = 87031808 (83.0MB)NewRatio                 = 2SurvivorRatio            = 8MetaspaceSize            = 21807104 (20.796875MB)CompressedClassSpaceSize = 1073741824 (1024.0MB)MaxMetaspaceSize         = 17592186044415 MBG1HeapRegionSize         = 0 (0.0MB)

堆的默认大小是1968M,不到两个G,新生代656M,老年代83M,这个大小在提取大数据的时候很容易内存溢出,我们默认就碰到了。

新生代和老年代的比例一般设置为1:2 ,基本原则是让新生代设置尽量小一点,让垃圾回收在新生代回收多一点,老年代因为比例比较大,空间比较足,

他的回收次数会稍微少一点,老年代的垃圾回收是MajorGC,也就是Full GC,时间较长;新生代是对象初始的地方,所以会频繁的GC,对象经历多次GC默认是15或者较大的对象会直接到老年代,所以老年代的空间要大一点,默认只有83M,不内存溢出才有鬼了。

我生产上的参数,可以设置在catalina.sh里面最开始的地方,也可以设置在自启动脚本中

export JAVA_OPTS="-server -Xms3072m -Xmx3072m -Xmn900m -XX:MetaspaceSize=128m -XX:MaxMetaspaceSize=512m -XX:PermSize=256M -XX:MaxPermSize=512m -XX:+HeapDumpOnOutOfMemoryError -verbose:gc -XX:+PrintGCDetails -XX:+PrintGCDateStamps -Xloggc:gc_jsb.log -XX:+UseParNewGC -XX:-OmitStackTraceInFastThrow -XX:+UseCMSInitiatingOccupancyOnly -XX:CMSInitiatingOccupancyFraction=75 -XX:+UseConcMarkSweepGC -XX:CMSFullGCsBeforeCompaction=5"

-server: 因为tomcat默认是以一种叫java –client的模式来运行的,server即意味着你的tomcat是以真实的production的模式在运行的,这也就意味着你的tomcat以server模式运行时将拥有:更大、更高的并发处理能力,更快更强捷的JVM垃圾回收机制,可以获得更多的负载与吞吐量等,所以生产上一般都会用server模式。

-Xms和–Xmx:内存分配值,堆大小,一个是初始值,一个是最大值,一般都要设置为同样大小,因为如果内存达到最大值开始回落到初始值的时候肯定触发了GC机制,老年代区回收内存触发MajorGC,也就是我们说的Full GC 世界暂停,触发Full GC会停止(STW)所有线程去等待GC完成,所以会CPU高速运转,严重的时会感觉到系统卡顿等现象,所以一般设置为一样大小即可。命令java -Xmx2048M -version可以检测你的java支不支持设置2G内存,现在基本都是64位的jdk,所以一般都支持,如果是32位的可能需要检测一下,如果正常显示java版本,说明支持。

-Xmn: 新生代大小

-XX:MaxNewSize:新生代占整个堆内存的最大值。

-XX:NewRatio=2 新生代和老年代的比例

-XX:MetaspaceSize=128 #Metaspace是所有线程共享的一块内存区域,主要存放已被虚拟机加载的类定义,方法定义,常量等一些元数据信息,MetaspaceSize 表示的并非是元空间的大小,它的含义是:主要控制matesaceGC发生的初始阈值,也就是最小阈值。也就是说当使用的matespace空间到达了MetaspaceSize的时候,就会触发Metaspace的GC
-XX:MaxMetaspaceSize=512m #MaxMetaspaceSize表示的是保证committed的内存不会超过这个值,一旦超过这个值就会触发GC。注意:在jvm启动的时候,并不会分配MaxMetaspaceSize这么大的一块内存出来,metaspace是可以一直扩容的,直到到达MaxMetaspaceSize;

-XX:PermSize:设置非堆内存初始值,默认是物理内存的1/64。在数据量的很大的文件导出时,一定要把这两个值设置上,否则会出现内存溢出的错误。

-XX:MaxPermSize:Perm(俗称方法区)占整个堆内存的最大值,也称内存最大永久保留区域。

-XX:+DisableExplicitGC 在程序代码中不允许有显示的调用”System.gc()

-XX:+UseParNewGC 对年轻代采用多线程并行回收,这样收得快

-XX:+UseConcMarkSweepGC 即CMS gc,这一特性只有jdk1.5即后续版本才具有的功能,它使用的是gc估算触发和heap占用触发。我们知道频频繁的GC会造面JVM的大起大落从而影响到系统的效率,因此使用了CMS GC后可以在GC次数增多的情况下,每次GC的响应时间却很短,比如说使用了CMS GC后经过jprofiler的观察,GC被触发次数非常多,而每次GC耗时仅为几毫秒。

XX:MaxTenuringThreshold 设置垃圾最大年龄。如果设置为0的话,则年轻代对象不经过Survivor区,直接进入年老代。对于年老代比较多的应用,可以提高效率。如果将此值设置为一个较大值,则年轻代对象会在Survivor区进行多次复制,这样可以增加对象再年轻代的存活时间,增加在年轻代即被回收的概率。

这个值,默认是15吧

-XX:CMSFullGCsBeforeCompaction=5 内存导致大量的内存碎片,可以在5次GC之后,做一次Compaction压缩操作

-XX:CMSInitiatingOccupancyFraction=75 老年代带到75%的时候触发内存回收机制

-XX:+UseCMSInitiatingOccupancyOnly 该参数启用后,参数CMSInitiatingOccupancyFraction才会生效。默认关闭。

-Xss:是指设定每个线程的堆栈大小。这个就要依据你的程序,看一个线程 大约需要占用多少内存,可能会有多少线程同时运行等。一般不易设置超过1M,要不然容易出现out ofmemory。
-XX:+AggressiveOpts:启用这个参数,则每当JDK版本升级时,你的JVM都会使用最新加入的优化技术。
-XX:+UseBiasedLocking:启用一个优化了的线程锁,我们知道在我们的appserver,每个http请求就是一个线程,有的请求短有的请求长,就会有请求排队的现象,甚至还会出现线程阻塞,这个优化了的线程锁使得你的appserver内对线程处理自动进行最优调配。

-Xloggc:/opt/app/ard-user/ard-user-gc-%t.log 设置日志目录和日志名称

-XX:+UseGCLogFileRotation 开启滚动生成日志

-XX:NumberOfGCLogFiles=5 滚动GC日志文件数,默认0,不滚动

-XX:GCLogFileSize=20M GC文件滚动大小,需开启UseGCLogFileRotation

-XX:+PrintGCDetails 开启记录GC日志详细信息(包括GC类型、各个操作使用的时间),并且在程序运行结束打印出JVM的内存占用情况

-XX:+ PrintGCDateStamps 记录系统的GC时间

-XX:+PrintGCCause 产生GC的原因(默认开启)

容器的优化

 <Connector port="8080" protocol="org.apache.coyote.http11.Http11Nio2Protocol"connectionTimeout="20000"redirectPort="8443"executor="tomcatThreadPool"enableLookups="false"acceptCount="2000"maxPostSize="10485760"compression="on"disableUploadTimeout="true"compressionMinSize="2048"noCompressionUserAgents="gozilla, traviata"acceptorThreadCount="2"compressableMimeType="text/html,text/xml,text/plain,text/css,text/javascript,application/javascript"URIEncoding="utf-8"/><!-- A "Connector" using the shared thread pool--><Executor name="tomcatThreadPool" namePrefix="catalina-exec-"maxThreads="2000" minSpareThreads="300"prestartminSpareThreads="true" maxQueueSize="500"/><Connector port="8443" protocol="org.apache.coyote.http11.Http11NioProtocol"maxThreads="150" SSLEnabled="true"maxParameterCount="1000"><SSLHostConfig><Certificate certificateKeystoreFile="/weblogic/app/pts/apache-tomcat-9.0.80/conf/keystoremp.jks"certificateKeystorePassword="mpstore"certificateKeyPassword="mpkey"type="RSA"/></SSLHostConfig></Connector>

protocol 协议类型,可选类型有4种,BIO(阻塞型IO),NIO,NIO2和APR;BIO(Blocking I/O) 阻塞式I/O操作,Java nio是一个基于缓冲区、非阻塞I/O操作的Java API它拥有比传统I/O操作(bio)更好的并发运行性能。Tomcat8在Linux系统中默认使用这种方式,如果是7的话需要设置protocol=“org.apache.coyote.http11.Http11NioProtocol”表示使用NIO,org.apache.coyote.http11.Http11Nio2Protocol表示使用NIO2,性能更好吧

URIEncoding=”UTF-8” 使得tomcat可以解析含有中文名的文件的url

maxSpareThreads 的意思就是如果空闲状态的线程数多于设置的数目,则将这些线程中止,减少这个池中的线程总数。

minSpareThreads 最少空闲线程数

executor=“commonThreadPool” 指定线程池

maxThreads :Tomcat使用线程来处理接收的每个请求。这个值表示Tomcat可创建的最大的线程数,即最大并发数,所以这也决定了QPS的数量。

acceptCount:是当线程数达到maxThreads后,后续请求会被放入一个等待队列,这个acceptCount是这个队列的大小,如果这个队列也满了,就直接refuse 、

connectionTimeout:为网络连接超时时间毫秒数。

compression:是否开启JZip压缩

compressionMinSize:压缩处理的最小大小是多少,即包的大小超过这个配置才进行压缩,单位是k,默认是2048

disableUploadTimeout:是否给一些配置为上传的servlet放宽超时时长,单独配置超时时长

maxConnections:最大连接数,一般和maxThreads保持一致

enableLookups ”设置为“false”来关闭DNS 查询。当DNS查询被关闭时,request.getRemoteHost()将返回包含远程客户IP地 址的字符串。

noCompressionUserAgents=“gozilla, traviata” 对于以下的浏览器,不启用压缩

compressableMimeType=“text/html,text/xml” 压缩类型

SSLHostConfig 设置证书,正常不需要设置

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

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

相关文章

dotnet命令创建C#项目,VSCode打开

在命令行中创建项目并运行 1.首先安装.net 下载地址:.NET | 构建。测试。部署。 2.在 cmd 控制台输入 dotnet --vesion 检查版本号是否正常 3.我用git bash环境输入命令创建项目 // 创建文件夹 mkdir MyVSCode // 进入该文件夹 cd MyVSCode/ // 创建控制台项目 dotnet …

03-基于GEC6818开发板实现BMP图片的加载——实例分析

03-基于GEC6818开发板实现加载一张图片 实现基于GEC6818开发板实现加载一张BMP文件。其中详细解析了一张BMP格式图的内容。 其他相关GEC6818开发板的内容可以参考 01-基于粤嵌GEC6818实现屏幕的显示固定颜色进行自动切换 02-基于GEC6818开发板的画正方形、画圆的操作——使用mm…

项目应用多级缓存示例

前不久做的一个项目&#xff0c;需要在前端实时展示硬件设备的数据。设备很多&#xff0c;并且每个设备的数据也很多&#xff0c;总之就是数据很多。同时&#xff0c;设备的刷新频率很快&#xff0c;需要每2秒读取一遍数据。 问题来了&#xff0c;我们如何读取数据&#xff0c…

74hc138电路图汇总分析

74hc138大家应该比较熟悉&#xff0c;关于它的应用电路你了解多少呢&#xff1f;它在电路中是一个什么样的角色定位呢&#xff1f;本文主要为你介绍关于74hc138电路图汇总分析以及74hc138在电路中的作用。 74hc138 74HC138是一款高速CMOS器件&#xff0c;74HC138引脚兼容低功…

【计算机视觉中的多视图几何系列】深入浅出理解针孔相机模型

温故而知新&#xff0c;可以为师矣&#xff01; 一、参考资料 《计算机视觉中的多视图几何-第五章》-Richard Hartley, Andrew Zisserman. 二、针孔模型相关介绍 1. 重要概念 1.1 投影中心/摄像机中心/光心 投影中心称为摄像机中心&#xff0c;也称为光心。投影中心位于一…

职场记7:冲破求职迷雾,踏入新的工作环境

上一篇《职场记6&#xff1a;在国企工作&#xff0c;追逐挑战与成就》 工作日的早晨&#xff0c;在炎炎夏日的照射下&#xff0c;城市仿佛变成了一个巨大的蒸笼。街头巷尾&#xff0c;人群涌动&#xff0c;各种人物形象鲜明&#xff0c;构成了一幅生动的夏日画卷。 老人们手持…

spring aop实际开发中怎么用,Spring Boot整合AOP,spring boot加spring mvc一起使用aop,项目中使用aop

前言&#xff1a;本文不介绍 AOP 的基本概念、动态代理方式实现 AOP&#xff0c;以及 Spring 框架去实现 AOP。本文重点介绍 Spring Boot 项目中如何使用 AOP&#xff0c;也就是实际项目开发中如何使用 AOP 去实现相关功能。 如果有需要了解 AOP 的概念、动态代理实现 AOP 的&…

web架构师编辑器内容-改进字体下拉菜单

前面说到我们可以通过面板配置来更新画布上面的一些属性&#xff0c;如果我们有这样一个需求&#xff1a;在右侧面板配置里面需要查看字体的样式效果我们应该怎么做呢&#xff1f; 我们一开始字体的渲染&#xff1a; const fontFamilyArr [{value: "SimSun","…

在数字电路中,为什么说避免输入信号的缓慢变化,对缓慢变化的信号需要使用施密特触发器输入的器件进行驱动?

在数字电路中,避免输入信号的缓慢变化(如按键复位信号)是非常重要的,因为缓慢变化的信号可能会导致数字逻辑电路的不确定状态和错误操作。施密特触发器(Schmitt Trigger)是一种特殊的电路,它可以解决这个问题。 缓慢变化信号的问题: 噪声敏感性:当输入信号缓慢变化时…

vue事件绑定

vue提供了v-on事件绑定指令&#xff0c;用来辅助程序员为DOM元素绑定事件监听&#xff0c;语法格式如下&#xff1a; v-on&#xff1a;指令可以简写为 注意&#xff1a;原生DOM对象有onclick&#xff0c;oninput&#xff0c;onkeyup等原生事件&#xff0c;替换为vue的事件绑定…

设计模式之-3种常见的工厂模式简单工厂模式、工厂方法模式和抽象工厂模式,每一种模式的概念、使用场景和优缺点。

文章目录 前言一、3种模式的概念、使用场景和优缺点简单工厂模式&#xff08;Simple Factory Pattern&#xff09;&#xff1a;工厂方法模式&#xff08;Factory Method Pattern&#xff09;&#xff1a;抽象工厂模式&#xff08;Abstract Factory Pattern&#xff09;&#xf…

PYQT的使用入门

上一章节&#xff1a;VSCode安装PYQT5-CSDN博客 vscode导航栏右键&#xff0c;新建ui文件

<软考高项备考>《论文专题 - 23 整合管理(1) 》

1 论文基础情况 1.1 各过程写作要点 过程定义、作用写作要点、思路制定项目章程制定项目章程是编写一份正式批准项目并授权项目经理在项目活动中使用组织资源的文件的过程。作用:①明确项目与组织战略目标之间的直接联系&#xff1b;②确立项目的正式地位;③展示组织对项目的…

Python高级语法与正则表达式

Python提供了 with 语句的写法&#xff0c;既简单又安全。 文件操作的时候使用with语句可以自动调用关闭文件操作&#xff0c;即使出现异常也会自动关闭文件操作。 # 1、以写的方式打开文件 with open(1.txt, w) as f:# 2、读取文件内容f.write(hello world) 生成器的创建方…

【Netty】编解码器

目录 Java的编解码Netty编解码器概念解码器(Decoder)编码器(Encoder)编码解码器Codec Java的编解码 编码&#xff08;Encode&#xff09;称为序列化&#xff0c; 它将对象序列化为字节数组&#xff0c;用于网络传输、数据持久化或者其它用途。 解码&#xff08;Decode&#x…

Go中的Context是什么?

在 Go 编程语言&#xff08;通常称为 Golang&#xff09;中&#xff0c;术语 "上下文 "指的是上下文包及其定义的上下文类型。上下文包用于跨 API 边界和进程间传输截止日期、取消信号和其他请求范围值。 上下文包的主要目的是管理并发或分布式系统中操作的生命周期…

Python量化投资——金融数据最佳实践: 使用qteasy+tushare搭建本地金融数据仓库并定期批量更新【附源码】

用qteasytushare实现金融数据本地化存储及访问 目的什么是qteasy什么是tushare为什么要本地化使用qteasy创建本地数据仓库qteasy支持的几种本地化仓库类型配置本地数据仓库配置tushare 的API token 配置本地数据源 —— 用MySQL数据库作为本地数据源下载金融历史数据 数据的定期…

基于多反应堆的高并发服务器【C/C++/Reactor】(中)

在这篇文章中虽然实现了能够和多客户端建立连接&#xff0c;并且同时和多个客户端进行通信。 基于多反应堆的高并发服务器【C/C/Reactor】&#xff08;上&#xff09;-CSDN博客https://blog.csdn.net/weixin_41987016/article/details/135141316?spm1001.2014.3001.5501但是有…

nginx安装letsencrypt证书

1.安装推荐安装letsencrypt证书的客户端工具 官方推荐通过cerbot客户端安装letsencrypt 官方推荐使用snap客户端安装cerbot客户端 apt install snapd snap install --classic certbot 建立certbot软链接&#xff1a;ln -s /snap/bin/certbot /usr/bin/certbot 2.开始安装letse…

速盾网络:高防IP的好处

随着互联网的快速发展&#xff0c;网络安全问题日益突出&#xff0c;越来越多的企业和个人开始关注网络安全防护。其中&#xff0c;高防IP作为一种高效的防御手段&#xff0c;越来越受到用户的青睐。本文将介绍速盾网络高防IP的好处&#xff0c;帮助您了解其优势和应用场景。一…