本文转载自微信公众号《Java极客技术》,作者鸭血范。转载本文请联系Java极客技术公众号。前几天,阿芬的一个小学生在面试的时候问了阿芬关于Tomcat调优和JVM优化的问题。我一听,就想说,这样问不对吗?那么下面阿粉就给大家讲讲Tomcat优化和JVM参数优化。Tomcat关于Tomcat是什么,相信大家做开发的一定不陌生。Server,Web应用服务器,一种轻量级的应用服务器,广泛应用于中小型系统和并发访问用户不多的场合。使用是开发调试JSP程序的首选。在我们日常的开发中,可能有很大一部分人只知道如何使用Tomcat服务器,却不知道如何调整Tomcat中的各种配置参数,让Tomcat运行的更好,下面就听阿粉给大家介绍一下.配置文件修改优化Windows下Tomcat的总目录就是我们下载解压后的目录,就是${TOMCAT_HOME},像这样D:\develop\tomcat\apache-tomcat-7.0.88,他的配置文件是conf下的server.xml文件,我们要调的一定是这个文件里面的内容。我们先从Connector开始分析:Connector:连接器负责接收客户端的请求,并向客户端发送响应消息。我们在优化Connector的时候,其实我们优化的是我们访问请求时的并发能力,而往往并发性也是我们工作中需要考虑很多次的问题,而我们在这个connector里面可以配置什么呢?我们最常用的就是在里面配置统一的URL编码格式。比如我们在里面配置一个UTF-8编码格式。URIEncoding:URIEncoding=UTF-8executor:指定这个connector使用的executor(线程池)connectionTimeout:连接超时maxThreads:客户端请求的最大线程数minSpareThreads:Tomcat初始化时创建的线程数,以及连接的线程数会一直运行maxSpareThreads:Tomcat连接器的最大空闲线程数minProcessors:创建服务器时的最小处理线程数maxProcessors:服务器上同时处理的最大线程数如果消耗性能,我们有时会关闭redirectPort:在需要安全通道的情况下,将客户端请求转发到基于SSL的redirectPort端口acceptAccount:最大监听端口队列数,满了会拒绝客户端请求(不能小于maxSpareThreads),而且我们一般用的最多的是URIEncoding,很少改变其他配置,但是在面试中,我们肯定不会要求你优化编码格式,我们修改的肯定是其他的东西最大处理线程数,域名解析,我们最终的配置不再是上面的代码,而是优化后的:NIOandBIOandNIO2其实关于NIO,BIOAIO,之前阿凡已经说过了,同步阻塞IO就是BIO,同步非阻塞IO和异步阻塞IO是NIO,异步非阻塞IO是AIO,BIO:同步阻塞IONIO:同步非阻塞IO和异步阻塞IOAIO:这种异步非阻塞IO是最需要注意的是,只有JDK7以上才支持。话不多说,怎么直接修改,网上有人说从Tomcat8及以上是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.4orlator)注意这个,整个堆大小=新生代大小+老年代大小+持久代大小。-XX:NewSize:设置新生代大小(for1.3/1.4)-XX:MaxNewSize:最大新生代大小(for1.3/1.4)-XX:PermSize:设置永久代(permgen)初始值为1/64ofthephysicalmemory-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:FULLGC时压缩老年代-XX:LargePageSizeInBytes:内存页的大小不能设置太大,会影响Per的大小m-XX:+UseFastAccessorMethods:原始类型的快速优化-XX:+UseCMSInitiatingOccupancyOnly:使用手动定义初始化定义启动CMS采集这些内容需要你手动选择一些自己适当配置,而不是一下子全部复制,否则会适得其反。给阿粉点时间看?