[root@localhost ~]# cat server.xml ...... <Connector port="8080" protocol="HTTP/1.1" maxHttpHeaderSize="8192" # 设置 HTTP 头部大小 maxThreads="5000" # 指定可建立的最大线程数, 默认值为 200 minSpareThreads="30" # 指定最小空闲线程数, 默认值是 25 maxSpareThreads="300" # 指定最大空闲线程数 maxIdleTime="60000" # 指定线程最大空闲时间, 单位毫秒 minProcessors="30" # 服务器建立时的最小处理线程数 maxProcessors="5000" # 服务器同时最大处理线程数 enableLookups="false" # 关闭主机名反解, 值为 true 或 false; true 返回主机名, false 返回 IP 地址 URIEncoding="utf-8" # 设置 URL 编码 acceptCount="5000" # 监听端口队列最大数(不能小于 maxSpareThreads) redirectPort="8443" # 在须要基于安全通道的场合, 把客户请求转发到基于 SSL 的端口 disableUploadTimeout="false" # 指定上传时是否使用超时机制, 值为 true 或 false compression="on" # 指定是否对响应的数据进行 GZIP 压缩, on 容许压缩(文本压缩), off 禁止压缩, force 全部状况都进行压缩, 默认值为 off compressionMinSize="2048" # 指定压缩响应的最小值, 响应报文大小大于该值对报文进行压缩, 默认值为 2048 compressableMimeType="text/html,text/xml,text/javascript,text/css,text/plain" # 压缩类型 noCompressionUserAgents="gozilla,traviata" # 指定对如下的浏览器不启用压缩 connnectionTimeout="30000" # 指定网络链接超时时间, 0 表示永不超时, 单位毫秒 connectionUploadTimeout="150000" # 指定上传超时时间, 单位毫秒 keepAliveTimeout="120000" # 指定长链接最大保持时间, 默认使用 connectionTimeout 时间, -1 表示不限制超时, 单位毫秒 maxKeepAliveRequests="1" # 最大长链接个数, 1 表示禁用长链接, -1 表示不限制长链接个数, 默认运行保持 100 长链接 connectionTimeout="5000" /> # 客户链接超时的时间, 若是为 -1 表示不限制创建客户链接的时间, 单位毫秒
Tomcat 链接器的三种方式: bio、nio 和 apr, apr 性能最优, bio 性能最差 BIO: 同步并阻塞, 服务器实现模式为一个链接一个线程(默认的工做模式) # NIO 的工做模式 NIO: 同步非阻塞(JDK1.4 以上版本) <Connector port="8080" protocol="org.apache.coyote.http11.Http11NioProtocol" connectionTimeout="20000" URIEncoding="UTF-8" useBodyEncodingForURI="true" enableLookups="false" redirectPort="8443" /> # APR 的工做模式 APR: 从操做系统级别来解决异步的 IO 问题, 大幅度的提升性能, JDK7 开始支持, 须要安装官方的插件才能使用 http://tomcat.apache.org/native-doc/ # 插件下载 yum -y install tomcat-native # 或者使用 yum 安装, 在 epel 中 <Connector port="8080" protocol="org.apache.coyote.http11.Http11AprProtocol" connectionTimeout="20000" URIEncoding="UTF-8" useBodyEncodingForURI="true" enableLookups="false" redirectPort="8443" />
[root@localhost ~]# cat context.xml # 设置上下文最大可用缓存 <Resources cachingAllowed="true" cacheMaxSize="100000" /> cachingAllowed 指定容许开启缓存 cacheMaxSize 指定最大可用缓存, 默认 10M, 单位 KB
[root@localhost ~]# cat catalina.properties # 禁用 TLDs 扫描 tomcat.util.scan.StandardJarScanFilter.jarsToSkip = ****
JVM
优化主要修改 catalina.sh
脚本里面 JAVA_OPTS
和 CATALINA_OPTS
的参数JAVA_OPTS
: 设置 JVM
相关运行参数的变量,用于Java运行时选项start
, stop
或 run
命令执行CATALINA_OPTS
: 设置 Tomcat
相关运行参数的变量, 用于 Java
运行时选项 start
, run
命令执行javascript
JVM
内存划分分为新生代(Young Generation)
、老年代(Old Generation)
、永久代(Permanent Generation)
堆内存(Heap) = 新生代 + 老年代, 非堆内存 = 永久代
css
CATALINA_OPTS=" ${CATALINA_OPTS} -server -Xms6000M -Xmx6000M -Xss512k -XX:NewSize=2250M -XX:MaxNewSize=2250M -XX:+AggressiveOpts -XX:+UseBiasedLocking -XX:+DisableExplicitGC -XX:+UseParNewGC -XX:+UseConcMarkSweepGC -XX:MaxTenuringThreshold=15 -XX:+CMSParallelRemarkEnabled -XX:LargePageSizeInBytes=128M -XX:+UseFastAccessorMethods -XX:+UseCMSInitiatingOccupancyOnly -Duser.timezone=Asia/Shanghai -Djava.awt.headless=true -Dfile.encoding=UTF8 -Dsun.jnu.encoding=UTF8 " -server 启动速度慢, 运行时性能和内存管理效率高 -clien 启动速度快, 运行时性能和内存管理效率低 -Xms 指定 Java 初始化堆大小, -Xms 与 -Xmx 设成同样的值, 避免 JVM 反复从新申请内存, 默认值为物理内存的 1/64, 空余堆内存小于 40% 时 JVM 增大堆直到 -Xmx 的最大限制 -Xmx 指定 Java 最大堆大小, 最大值设置为可用内存的最大值的 80%, 空余堆内存大于 70% 时 JVM 减小堆直到 -Xms 的最小限制 -Xss 指定每一个 Java 线程堆栈大小, 每一个线程堆栈大小为 1M, 线程大小不建议超过 1M -XX:NewSize 指定新生代内存大小 -XX:MaxNewSize 指定最大新生代内存大小 -XX:+AggressiveOpts 指定每当 JDK 版本升级时, JVM 都会使用最新加入的优化技术 -XX:+UseBiasedLocking 指定优化线程锁对线程处理自动进行最优调配 -XX:+DisableExplicitGC 指定程序代码中不容许显示调用 System.gc() -XX:+UseConcMarkSweepGC 指定老年代为并发收集(CMS GC), CMS GC在GC次数增多的状况下, 每次GC的响应时间很短(几毫秒) -XX:+UseParNewGC 指定新生代采用多线程并行回收 -XX:MaxTenuringThreshold 指定垃圾最大年龄, 设置为 0 新生代对象不通过 Survivor 区, 直接进入老年代, 对于老年代比较多的应用(须要大量常驻内存的应用)能够提升效率; 设置为一个较大值新生代对象会在 Survivor 区进行屡次复制, 能够增长对象在新生代的存活时间, 增长在新生代即被回收的几率, 减小 Full GC 的频率。该参数只有在串行 GC 时才有效 -XX:+CMSParallelRemarkEnabled 指定使用 UseParNewGC 的状况下, 尽可能减小 Mark 的时间 -XX:LargePageSizeInBytes 指定 Java Heap 的分页页面大小, 内存页的大小不可设置过大, 会影响 Perm 的大小 -XX:+UseFastAccessorMethods 指定使用 Get, Set 方法转成本地代码, 原始类型的快速优化 -XX:+UseCMSInitiatingOccupancyOnly 指定在 Oldgeneration 在使用了初始化的比例后 Concurrent Collector 启动收集 -Duser.timezone=Asia/Shanghai 指定时区 -Djava.awt.headless=true 兼容 Linux/Unix 下图形报表显示输出 -Xmn 指定新生代内存大小, 增大新生代后将会减少老年代大小, 对系统性能影响较大, Sun 官方推荐配置为整个堆的 3/8 -XX:CMSInitiatingOccupancyFraction 当堆满以后, 并行收集器开始进行垃圾收集, 与 Xmn 关联使用 -XX:+CMSIncrementalMode 指定开启 CMS 收集器增量模式, 增量模式常常暂停 CMS 过程, 对应用程序线程做出彻底的让步 -XX:+UseSerialGC 指定使用串行收集器, 老年代使用串行收集 -XX:+UseParallelGC 指定使用并行收集器, 新生代使用并行收集 -XX:+UseParallelOldGC 指定老年代垃圾收集方式为并行收集 -XX:ConcGCThreads 指定并发 CMS 过程运行时的线程数, 若是未设置, JVM 会根据并行收集器中的 -XX:ParallelGCThreads 参数的值来计算出默认的并行 CMS 线程数 -XX:ParallelGCThreads 指定并行收集器的线程数,建议配置与CPU数目相等 -XX:OldSize 指定老年代内存大小 设置字符集编码: -Dfile.encoding=UTF8 -Dsun.jnu.encoding=UTF8 -Djavax.servlet.request.encoding=UTF-8 -Djavax.servlet.response.encoding=UTF-8 -Dfile.encoding=UTF-8 -Duser.country=CN -Duser.language=zh