性能优化
有几个与性能关系密切的属性
- maxThreads:指定Connector创建的请求处理线程的最大数目。该属性决定了可以并行处理的请求最大数目,即并发上限。当并发请求数超过maxThreads时,多余的请求只能排队等待
- maxSpareThreads:Tomcat允许的空闲线程的最大数目,超出的空闲线程将被直接关闭默认50
- minSpareThreads:Tomcat允许的空闲线程的最小数目,也是启动时Connector创建的线程数目。如果空闲线程数小于该值,Tomcat将创建新的线程。默认4
- tcpNoDelay:该属性为true,会启用Socket的TCP_NO_DELAY选项。会禁用Nagle算法,该算法通过降低网络发送包的数量提升网络利用率。在非交互式的web应用环境中,该算法会缩短响应时间。但是在交互式web应用环境中则会加大响应时间,因为它会将小包拼接为大包在进行发送,从而导致响应延迟
- maxKeepAliveRequest:用于控制HTTP请求的“keep-alive”行为,以启用持续链接(多个请求通过同一个HTTP连接发送)。该属性指定HTTP连接在被服务器关闭之前处理的请求最大数目。默认100,如果设置为1,表示禁用该特性
- socketBuffer:用于指定Socket输出缓冲的大小,单位为字节
- enableLookups:设置为false,会禁用request.getRemoteHost()方法的DNS查询,从而提升响应性能(减少DNS查询耗时)
JVM优化
内存分配以及GC策略调整,选择不同的垃圾回收策略,调整JVM以及垃圾回收参数,可以极大地减少垃圾回收次数,提升垃圾回收效率,从而改善程序运行性能。
垃圾收集器
串行收集器:采用单线程执行所有的垃圾回收工作,适用于单核的服务器
并行收集器:以并行的方式执行Minor回收(年轻代垃圾回收),可以降低垃圾回收的开销,适用于多处理器,需要启用并行压缩
并发收集器:以并发的方式执行大部分垃圾回收工作,缩短垃圾回收的暂停时间,适用于数据集中为中型到大型、响应时间优先于吞吐量的应用。虽然减少了暂停时间,但是会降低应用程序性能
JDK8中提供了两种并发收集器
CMS收集器:并发标记扫描收集器,适用于缩短垃圾回收暂停时间并且负担得起与垃圾回收共享资源的应用
G1收集器:适用于大容量内存的多核服务器,在满足垃圾回收暂停时间目标的同时,以最大可能性实现高吞吐量
JVM参数
- -Xms 初始堆的大小,如不指定,初始化大小为分配的年轻代和年老代之和
- -Xmx 最大堆内存,xms和xmx设置为一个值,可以减少程序运行过程中调整堆内存分配的耗时
- -Xmn 年轻代的初始值及最大值,推荐为堆内存的1/2~1/4之间
- -XX:NewSize 年轻代初始值
- -XX:MaxNewSize 年轻代最大值
- -XX:MetaspaceSize 元数据空间的初始值
- -XX:MaxMetaspaceSize 分配用于类元数据的本地内存上限,默认不受限
- -Xss 线程栈大小
- -XX:ThreadStackSize 等价于xss
- -XX:NewRatio 设置年轻代和年老代大小的比值,默认2
- -XX:SurvivorRatio Eden区和Survivor区大小的比值,默认为2
- -XX:LargePageSizeInBytes 堆内存的内存页大小,默认0,表示由JVM动态选择
- -XX:+DisableExplicitGC 禁用Sytem.gc
- -XX:MaxTenuringThreshold 在新生代中对象存活次数后仍然存活,晋升到旧生代,最大值15
- -XX:+AggressiveOpts 开启新的编译器性能优化选项
- -XX:+UseBiasedLocking 启用偏向锁
- -Xnoclassgc 禁用类的垃圾回收,即类对象不会回收
- -XX:SoftRefLRUPolicyMSPerMB 每兆空闲堆内存中,SoftReference对象在最后一次引用后的存活时间,默认1s
- -XX:MaxHeapFreeRatio 垃圾回收后,堆内存空闲空间最大允许百分比,如果超过该值,堆内存会收缩
- -XX:MinHeapFreeRatio 垃圾回收后,堆内存空闲空间最小百分比,如果低于该值,堆内存会扩大
- -XX:+ParallelRefProcEnabled 启用并行引用处理。如果应用存在大量的引用或者finalizable对象需要处理,可以减少垃圾回收时间
- -XX:TargetSurivorRatio 设定幸存区的目标使用率
- -XX:+UseGCOverheadLimit 限定JVM耗费在GC上的时间百分比
- -XX:+UseSerialGC 启用串行收集器
Tomcat配置
server.xml配置
- 修改链接器的maxConnections属性该属性决定了服务器在同一时间接收并处理的最大连接数
- tcpNoDeply属性设置为true,会开启Socket的TCP_NO_DEPLY选项,禁用Nagle算法,该算法用于链接小的缓冲消息,会降低通过网络发送数据包的数量,提升网络传输效率,但是对于交互式应用会增加响应时间
- 调整maxKeepAliveRequest属性,用于控制keep-alive行为,指定了链接被服务器关闭之前可以接受的请求最大数目
- 调整socketBuffer,调整Socket缓冲区大小
- 将enableLookups属性设置为false,禁用request.getRemoteHost的DNS查找功能,减少查找时间
- IO方式最好使用NIO2或者APR