这年头还有问Tomcat调优和JVM参数优化的,你还不知道怎么回答么?那么你一定需要看看这篇文章

本文涉及的产品
全局流量管理 GTM,标准版 1个月
云解析 DNS,旗舰版 1个月
公共DNS(含HTTPDNS解析),每月1000万次HTTP解析
简介: 前几天阿粉的一个小学弟在咨询阿粉面试的时候怎么还会问到关于Tomcat调优和JVM优化,我听完这个的时候,当时就想说,问这个不是应该的么?那么下面阿粉就给大家好好的掰扯掰扯这个Tomcat优化和 JVM 参数优化的事情

前几天阿粉的一个小学弟在咨询阿粉面试的时候怎么还会问到关于Tomcat调优和JVM优化,我听完这个的时候,当时就想说,问这个不是应该的么?那么下面阿粉就给大家好好的掰扯掰扯这个Tomcat优化和 JVM 参数优化的事情

Tomcat


46.jpg

关于Tomcat是什么东西,相信大家做开发的,肯定是一点也不陌生,服务器,Web应用服务器,一种轻量级的应用服务器,在中小型系统和并发访问用户不是很多的场合下被普遍使用,是开发和调试JSP 程序的首选。

而我们在日常的开发中,可能很大一部分我们只是知道怎么使用Tomcat服务器,但是却不知道怎么去调整Tomcat里面的各种配置参数,让Tomcat能够更好的运行,那么就听阿粉来给大家介绍把。

配置文件修改优化

Tomcat在Windows下一般的目录都是我们下载解压出来的目录也就是${TOMCAT_HOME},就像这个样子 D:\develop\tomcat\apache-tomcat-7.0.88,而他的配置文件就是conf下的server.xml文件,而我们需要调优的肯定也是这个文件里面的内容。

我们就先从 Connector 来进行分析:

Connector :连接器,负责接收客户的请求,以及向客户端回送响应的消息

而我们对 Connector 优化,其实优化的就是我们在访问请求时候的并发能力,而往往并发也是我们在工作中很多时候需要去考虑的问题,而我们在这个连接器里面可以配置什么内容呢?

<Connector executor="tomcatThreadPool"
               port="8080" protocol="HTTP/1.1"
               connectionTimeout="20000"
               redirectPort="8443" />

我们最常用的就是在里面配置一个URL的统一编码格式比如说我们在里面配置一个 UTF-8 的编码格式。

URIEncoding :URIEncoding = UTF-8

executor : 指定这个连接器所使用的执行器(线程池)

connectionTimeout :连接超时时间

maxThreads :客户请求最大线程数

minSpareThreads :Tomcat初始化时创建的线程数,一直会运行的线程

maxSpareThreads :Tomcat连接器的最大空闲线程数

minProcessors :服务器创建时的最小处理线程数

maxProcessors :服务器同时最大处理线程数

enableLookups :若设为true, 则支持域名解析,可把 ip 地址解析为主机名,而为了减少性能的消耗的话,我们就有时候会关闭它

redirectPort :在需要基于安全通道的场合,把客户请求转发到基于SSL 的 redirectPort 端口

acceptAccount :监听端口队列最大数,满了之后客户请求会被拒绝(不能小于maxSpareThreads )

而我们一般最常搭配的,却是 URIEncoding 而很少的去改其他的配置,但是在面试中,肯定不会说让你去优化编码格式把,而我们修改的一定是其他的关于最大处理线程数,域名解析啦,

而我们在最终的配置就不再是上面的代码了,而变成了优化之后的:

<Connector port="8080"
        protocol="HTTP/1.1" 
        connectionTimeout="20000" 超时时间,毫秒
        redirectPort="443" 
        maxThreads="3000" 最大线程数
        minSpareThreads="20" 最小空闲线程数,这里是一直会运行的线程
        acceptCount="1000" 监听端口队列数
        enableLookups="false" 关闭dns解析,减少性能损耗
        server="None"               
        URIEncoding="UTF-8"   
      />

NIO和BIO还有 NIO2

其实关于 NIO 和 BIO 和 AIO 阿粉在之前已经完全都说过了,同步阻塞 IO 就是 BIO ,而同步非阻塞IO和异步阻塞IO 就是 NIO ,而异步非阻塞IO就是 AIO 啦,

BIO :同步阻塞IO

47.jpg

NIO :同步非阻塞IO和异步阻塞IO

AIO :这种异步非阻塞 IO 是我们最需要注意的,是从 JDK7 及其以上才会支持的。

话不多说,直接上如何修改,

<Connector connectionTimeout="20000" port="8080" protocol="HTTP/1.1" redirectPort="8443"/>
<Connector connectionTimeout="20000" port="8080" protocol="org.apache.coyote.http11.Http11NioProtocol" redirectPort="8443"/>

网上有人说,从 Tomcat8 以上就是 NIO 模式了,但是实际情况好像是没有,还是需要自己手动去换成 NIO 模式。

关于 Tomcat的优化,阿粉就不再给大家叙述了,给大家再来说说这个关于 JVM 的优化。

JVM

阿粉最开始写文章的时候,就是首先从 JVM 写起来的,大家可以搜索一下曾经阿粉写的关于 JVM 的内容,里面有对 JVM 的完整的介绍,对 FullGC ,YGC 等垃圾收集方式,都做过介绍,这里阿粉只给大家介绍怎么去通过修改 Tomcat 的配置,来达到,我们对 JVM 的优化。

大家都知道,正确的选择不同的 GC 策略,调整 JVM、GC 的参数,可以极大的减少由于 GC 工作,而却这样会大大的提高我们程序的运行效率。

目录还是那个目录,Tomcat 的根目录下的 bin 目录,catalina.bat ,Linux的话,去修改.sh 的文件即可。

找到 JAVA_OPTS 而他就是用来设置 JVM 相关运行参数的变量的,在这里阿粉也给大家说一下关于 JVM 的参数属性,不然不能直接瞎改吧,容易出事。

-Xms :初始堆大小 物理内存的1/64(<1GB)

-Xmx :最大堆大小 物理内存的1/4(<1GB)

-Xmn :年轻代大小(1.4or lator)  注意的是这个 ,整个堆大小=年轻代大小 + 年老代大小 + 持久代大小.

-XX:NewSize :设置年轻代大小(for 1.3/1.4)

-XX:MaxNewSize :年轻代最大值(for 1.3/1.4)

-XX:PermSize :设置持久代(perm gen)初始值 物理内存的1/64

-XX:MaxPermSize :设置持久代最大值 物理内存的1/4

-Xss :每个线程的堆栈大小

-XX:NewRatio :年轻代(包括Eden和两个Survivor区)与年老代的比值(除去持久代)

-XX:+AggressiveOpts :加快编译

-XX:+UseBiasedLocking :锁机制的性能改善

-XX:+DisableExplicitGC :关闭System.gc()

-XX:+UseParNewGC :设置年轻代为并行收集

-XX:+UseConcMarkSweepGC :使用CMS内存收集

-XX:MaxTenuringThreshold :垃圾最大年龄

-XX+UseCMSCompactAtFullCollection :在FULL GC的时候, 对年老代的压缩

-XX:LargePageSizeInBytes :内存页的大小不可设置过大, 会影响Perm的大小

-XX:+UseFastAccessorMethods :原始类型的快速优化

-XX:+UseCMSInitiatingOccupancyOnly :使用手动定义初始化定义开始CMS收集

而这些内容就是需要你去自己手动去挑选一些合适的自己去配置上去,而不是一股脑的复制上去,不然适得其反就不好了。

给阿粉点个在看吧?

相关文章
|
4月前
|
存储 监控 算法
jvm-性能调优(二)
jvm-性能调优(二)
|
26天前
|
监控 架构师 Java
Java虚拟机调优的艺术:从入门到精通####
本文作为一篇深入浅出的技术指南,旨在为Java开发者揭示JVM调优的神秘面纱,通过剖析其背后的原理、分享实战经验与最佳实践,引领读者踏上从调优新手到高手的进阶之路。不同于传统的摘要概述,本文将以一场虚拟的对话形式,模拟一位经验丰富的架构师向初学者传授JVM调优的心法,激发学习兴趣,同时概括性地介绍文章将探讨的核心议题——性能监控、垃圾回收优化、内存管理及常见问题解决策略。 ####
|
2月前
|
Java
JVM内存参数
-Xmx[]:堆空间最大内存 -Xms[]:堆空间最小内存,一般设置成跟堆空间最大内存一样的 -Xmn[]:新生代的最大内存 -xx[use 垃圾回收器名称]:指定垃圾回收器 -xss:设置单个线程栈大小 一般设堆空间为最大可用物理地址的百分之80
|
2月前
|
监控 Java 编译器
Java虚拟机调优指南####
本文深入探讨了Java虚拟机(JVM)调优的精髓,从内存管理、垃圾回收到性能监控等多个维度出发,为开发者提供了一系列实用的调优策略。通过优化配置与参数调整,旨在帮助读者提升Java应用的运行效率和稳定性,确保其在高并发、大数据量场景下依然能够保持高效运作。 ####
33 1
|
2月前
|
存储 算法 Java
JVM进阶调优系列(10)敢向stop the world喊卡的G1垃圾回收器 | 有必要讲透
本文详细介绍了G1垃圾回收器的背景、核心原理及其回收过程。G1,即Garbage First,旨在通过将堆内存划分为多个Region来实现低延时的垃圾回收,每个Region可以根据其垃圾回收的价值被优先回收。文章还探讨了G1的Young GC、Mixed GC以及Full GC的具体流程,并列出了G1回收器的核心参数配置,帮助读者更好地理解和优化G1的使用。
|
2月前
|
监控 Java 测试技术
Elasticsearch集群JVM调优垃圾回收器的选择
Elasticsearch集群JVM调优垃圾回收器的选择
58 1
|
2月前
|
Arthas 监控 Java
JVM进阶调优系列(9)大厂面试官:内存溢出几种?能否现场演示一下?| 面试就那点事
本文介绍了JVM内存溢出(OOM)的四种类型:堆内存、栈内存、元数据区和直接内存溢出。每种类型通过示例代码演示了如何触发OOM,并分析了其原因。文章还提供了如何使用JVM命令工具(如jmap、jhat、GCeasy、Arthas等)分析和定位内存溢出问题的方法。最后,强调了合理设置JVM参数和及时回收内存的重要性。
|
2月前
|
监控 Java 编译器
Java虚拟机调优实战指南####
本文深入探讨了Java虚拟机(JVM)的调优策略,旨在帮助开发者和系统管理员通过具体、实用的技巧提升Java应用的性能与稳定性。不同于传统摘要的概括性描述,本文摘要将直接列出五大核心调优要点,为读者提供快速预览: 1. **初始堆内存设置**:合理配置-Xms和-Xmx参数,避免频繁的内存分配与回收。 2. **垃圾收集器选择**:根据应用特性选择合适的GC策略,如G1 GC、ZGC等。 3. **线程优化**:调整线程栈大小及并发线程数,平衡资源利用率与响应速度。 4. **JIT编译器优化**:利用-XX:CompileThreshold等参数优化即时编译性能。 5. **监控与诊断工
|
2月前
|
存储 监控 Java
JVM进阶调优系列(8)如何手把手,逐行教她看懂GC日志?| IT男的专属浪漫
本文介绍了如何通过JVM参数打印GC日志,并通过示例代码展示了频繁YGC和FGC的场景。文章首先讲解了常见的GC日志参数,如`-XX:+PrintGCDetails`、`-XX:+PrintGCDateStamps`等,然后通过具体的JVM参数和代码示例,模拟了不同内存分配情况下的GC行为。最后,详细解析了GC日志的内容,帮助读者理解GC的执行过程和GC处理机制。
|
3月前
|
Arthas 监控 数据可视化
JVM进阶调优系列(7)JVM调优监控必备命令、工具集合|实用干货
本文介绍了JVM调优监控命令及其应用,包括JDK自带工具如jps、jinfo、jstat、jstack、jmap、jhat等,以及第三方工具如Arthas、GCeasy、MAT、GCViewer等。通过这些工具,可以有效监控和优化JVM性能,解决内存泄漏、线程死锁等问题,提高系统稳定性。文章还提供了详细的命令示例和应用场景,帮助读者更好地理解和使用这些工具。