tomcat 调优
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 | tomcat优化配置参数 转载 2016 年 09 月 21 日 14 : 02 : 10 1786 1 、内存优化: 优化内存,主要是在 bin / catalina.bat / sh 配置文件中进行。linux上,在catalina.sh中添加: JAVA_OPTS = "-server -Xms1G -Xmx2G -Xss256K -Djava.awt.headless=true -Dfile.encoding=utf-8 -XX:MaxPermSize=256m -XX:PermSize=128M -XX:MaxPermSize=256M" 其中: • - server:启用jdk的server版本。 • - Xms:虚拟机初始化时的最小堆内存。 • - Xmx:虚拟机可使用的最大堆内存。 #-Xms与-Xmx设成一样的值,避免JVM因为频繁的GC导致性能大起大落 • - XX:PermSize:设置非堆内存初始值,默认是物理内存的 1 / 64 。 • - XX:MaxNewSize:新生代占整个堆内存的最大值。 • - XX:MaxPermSize:Perm(俗称方法区)占整个堆内存的最大值,也称内存最大永久保留区域。 1 )错误提示:java.lang.OutOfMemoryError:Java heap space Tomcat默认可以使用的内存为 128MB ,在较大型的应用项目中,这点内存是不够的,有可能导致系统无法运行。常见的问题是报Tomcat内存溢出错误,Outof Memory(系统内存不足)的异常,从而导致客户端显示 500 错误,一般调整Tomcat的 - Xms和 - Xmx即可解决问题,通常将 - Xms和 - Xmx设置成一样,堆的最大值设置为物理可用内存的最大值的 80 % 。 set JAVA_OPTS = - Xms512m - Xmx512m 2 )错误提示:java.lang.OutOfMemoryError: PermGenspace PermGenspace的全称是Permanent Generationspace,是指内存的永久保存区域,这块内存主要是被JVM存放Class和Meta信息的,Class在被Loader时就会被放到PermGenspace中,它和存放类实例(Instance)的Heap区域不同,GC(Garbage Collection)不会在主程序运行期对PermGenspace进行清理,所以如果你的应用中有很CLASS的话,就很可能出现PermGen space错误,这种错误常见在web服务器对JSP进行precompile的时候。如果你的WEB APP下都用了大量的第三方jar, 其大小超过了jvm默认的大小( 4M )那么就会产生此错误信息了。解决方法: setJAVA_OPTS = - XX:PermSize = 128M 3 )在使用 - Xms和 - Xmx调整tomcat的堆大小时,还需要考虑垃圾回收机制。如果系统花费很多的时间收集垃圾,请减小堆大小。一次完全的垃圾收集应该不超过 3 - 5 秒。如果垃圾收集成为瓶颈,那么需要指定代的大小,检查垃圾收集的详细输出,研究垃圾收集参数对性能的影响。一般说来,你应该使用物理内存的 80 % 作为堆大小。当增加处理器时,记得增加内存,因为分配可以并行进行,而垃圾收集不是并行的。 2 、连接数优化: #优化连接数,主要是在conf/server.xml配置文件中进行修改。 2.1 、优化线程数 找到Connectorport = "8080" protocol = "HTTP/1.1" ,增加maxThreads和acceptCount属性(使acceptCount大于等于maxThreads),如下: <Connectorport = "8080" protocol = "HTTP/1.1" connectionTimeout = "20000" redirectPort = "8443" acceptCount = "500" maxThreads = "400" / > 其中: • maxThreads:tomcat可用于请求处理的最大线程数,默认是 200 • minSpareThreads:tomcat初始线程数,即最小空闲线程数 • maxSpareThreads:tomcat最大空闲线程数,超过的会被关闭 • acceptCount:当所有可以使用的处理请求的线程数都被使用时,可以放到处理队列中的请求数,超过这个数的请求将不予处理.默认 100 2.2 、使用线程池 在server.xml中增加executor节点,然后配置connector的executor属性,如下: <Executorname = "tomcatThreadPool" namePrefix = "req-exec-" maxThreads = "1000" minSpareThreads = "50" maxIdleTime = "60000" / > <Connectorport = "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 查看每个用户允许打开的最大文件数 3 、Tomcat Connector三种运行模式(BIO, NIO, APR) 3.1 、三种模式比较: 1 )BIO:一个线程处理一个请求。缺点:并发量高时,线程数较多,浪费资源。Tomcat7或以下在Linux系统中默认使用这种方式。 2 )NIO:利用Java的异步IO处理,可以通过少量的线程处理大量的请求。Tomcat8在Linux系统中默认使用这种方式。Tomcat7必须修改Connector配置来启动(conf / server.xml配置文件): <Connectorport = "8080" protocol = "org.apache.coyote.http11.Http11NioProtocol" connectionTimeout = "20000" redirectPort = "8443" / > 3 )APR(Apache Portable Runtime):从操作系统层面解决io阻塞问题。Linux如果安装了apr和native,Tomcat直接启动就支持apr。 3.2 、apr模式 安装apr以及tomcat - native yum - y install apr apr - devel 进入tomcat / bin 目录,比如: cd / opt / local / tomcat / bin / tar xzfv tomcat - native.tar.gz cd tomcat - native - 1.1 . 32 - src / jni / native . / configure - - with - apr = / usr / bin / apr - 1 - config make && make install #注意最新版本的tomcat自带tomcat-native.war.gz,不过其版本相对于yum安装的apr过高,configure的时候会报错。 解决:yum remove apr apr - devel –y,卸载yum安装的apr和apr - devel,下载最新版本的apr源码包,编译安装;或者下载低版本的tomcat - native编译安装 安装成功后还需要对tomcat设置环境变量,方法是在catalina.sh文件中增加 1 行: CATALINA_OPTS = "-Djava.library.path=/usr/local/apr/lib" #apr下载地址:http://apr.apache.org/download.cgi #tomcat-native下载地址:http://tomcat.apache.org/download-native.cgi 修改 8080 端对应的conf / server.xml protocol = "org.apache.coyote.http11.Http11AprProtocol" <Connector executor = "tomcatThreadPool" port = "8080" protocol = "org.apache.coyote.http11.Http11AprProtocol" connectionTimeout = "20000" enableLookups = "false" redirectPort = "8443" URIEncoding = "UTF-8" / > PS:启动以后查看日志 显示如下表示开启 apr 模式 Sep 19 , 2016 3 : 46 : 21 PM org.apache.coyote.AbstractProtocol start INFO: Starting ProtocolHandler [ "http-apr-8081" ] |
时来天地皆同力,运去英雄不自由
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 【自荐】一款简洁、开源的在线白板工具 Drawnix
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY
· Docker 太简单,K8s 太复杂?w7panel 让容器管理更轻松!