Jvm与tomcat基础优化
Posted Java小朋友
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Jvm与tomcat基础优化相关的知识,希望对你有一定的参考价值。
jvm的简单配置示例
tomcat调优,springBoot内置tomcat调优
01
Jvm优化
1.1、示例
JAVA_OPTS="-server -Xmx30G -Xms30G -XX:+UseG1GC -XX:MaxGCPauseMillis=500
-XX:InitiatingHeapOccupancyPercent=45 -Xloggc:/usr/local/mergengine/mergengine_tomcat_8080/logs/gc.log -verbose:gc -XX:+PrintGCDetails -XX:+PrintGCDateStamps
-XX:+PrintGCTimeStamps -XX:+UseGCLogFileRotation -XX:NumberOfGCLogFiles=10
-XX:GCLogFileSize=100M
1.2、说明
1.2.1使用方式
1、若项目是外置tomcat,上诉配置添加在bin目录下的catalina.sh里面
2、若是Java –jar 的方式,直接添加在启动命令里面即可,如:
nohup java –jar -Xmx30G -Xms30G -server -XX:+UseG1GC xxx.jar > xx.log 2>&1 &
1.2.2 配置解释
-Xms 初始堆大小,物理内存的1/64(<1GB) 默认(MinHeapFreeRatio参数可以调整)空余堆内存小于40%时,JVM就会增大堆直到-Xmx的最大限制. 这里设置和最大堆一样。(网上有一个32G分水岭,简单说超过的话jvm地址映射会比较长,如40G或者50G也都相当于30G的效果,具体自己百度)
-Xmx 最大堆大小,物理内存的1/4(<1GB) 默认(MaxHeapFreeRatio参数可以调整)空余堆内存大于70%时,JVM会减少堆直到 -Xms的最小限制
-XX:+UseG1GC 使用的GC模式,是第四阶段的gc器,这种gc器是并行回收,且在回收新生代的时候会同时回收老年代。
-XX:MaxGCPauseMillis:设置每次年轻代垃圾回收的最长时间,如果无法满足此时间,JVM会自动调整年轻代大小,以满足此值(网上说较大可以提高吞吐量,具体根据每次gc耗时设置)
-XX:InitiatingHeapOccupancyPercent=45默认是45%,这个占比跟并发周期的启动相关,当空间占比达到这个值时,会启动并发周期。如果经常出现FullGC,可以调低该值,尽早的回收可以减少FullGC的触发,但如果过低,则并发阶段会更加频繁,降低应用的吞吐量
-Xloggc及后面的: 日志打印的配置
02
Tomcat优化
Tomcat配置分为两种情况:
第一种为通用的项目外置tomcat配置,
第二种为springboot内置tomcat的配置。
但不管哪一种配置,需要优化的东西都是一样的,主要是最大线程数、最大连接数、长连接与保持存活的时间。
2.1外置tomcat
主要是修改conf文件下的server.xml文件,具体操作示例步骤如下:
1、自定义线程池
<Executor name="tomcatThreadPool" namePrefix="catalina-exec-" maxThreads="1000"
minSpareThreads="500" maxIdleTime="180000" prestartminSpareThreads="true"
threadPriority="5"/>
2、配置示例
<Connector port="8080" protocol="org.apache.coyote.http11.Http11NioProtocol"
connectionTimeout="30000" asyncTimeout="30000" keepAliveTimeout="30000"
maxKeepAliveRequests="-1" executor="tomcatThreadPool" maxConnections="1000"
acceptCount="3000" maxThreads="1000" minSpareThreads="500" acceptorThreadCount="4" acceptorThreadPriority="5" maxHttpHeaderSize="4096" socketBuffer="10240" SSLEnabled="false" URIEncoding="UTF-8" useBodyEncodingForURI="true" tcpNoDelay="true" enableLookups="false" disableUploadTimeout="true" compression="off" compressionMinSize="512" noCompressionUserAgents="gozilla,traviata" compressableMimeType="text/html,text/xml,text/javascript,application/javascript,text/css,text/plain,application/json"/>
主要的配置项:
maxThreads:最大线程数。
maxConnections:最大连接数
maxKeepAliveRequests:长连接个数,-1表示无限制,实际验证只有-1才生效。
keepAliveTimeout:长连接保持时间ms
executor:使用的线程池,这里采用自定义的线程池
2.2 springBoot内置tomcat
01
步骤一,添加相应配置
Springboot内置tomcat配置,需要在配置文件application.properties添加配置,内容如下
server.tomcat.uri-encoding=UTF-8
server.tomcat.max-threads=1000 //最大线程
server.tomcat.max-connections=20000 //最大连接数
server.tomcat.max-keep-alive-requests=-1 //长连接个数,-1表示无限制
server.tomcat.keep-alive-timeout=30000 //长连接保持时间ms
注意:这里的配置只有前面三个可以直接生效,对于后面两个长连接的配置需要再做后面的操作(自定义配置tomcat)才生效。
02
步骤二,引入tomcat修改包
引pom文件,用于自定义tomcat。(想要自定义tomcat的配置文件,需要用到一些包,下面的maven包含这些包;这里不确定自己项目有没有已经存在相应包的同学可以把配置先拷贝到项目中,如果报错了再引这个maven)
<dependency>
<groupId>org.apache.tomcat.embed</greoupId>
<artifactId>tomcat-embed-core</artifactId>
<version>9.0.17</version>
</dependency>
03
步骤三,自定义配置(实现长连接)
写一个java类,可放在公共模块,将步骤一的两个长连接配置注入项目
@Configuration
public class SpringTomcatConfig {
/**
* 一个长连接接受最大请求数,超过该值则关闭(-1不限制)
*/
@Value("${server.tomcat.max-keep-alive-requests:-1}")
private int maxKeepAliveRequests;
/**
* 一个连接多长时间没接收请求就关闭(单位毫秒)
*/
@Value("${server.tomcat.keep-alive-timeout:30000}")
private int keepAliveTimeout;
@Bean
public ConfigurableServletWebServerFactory configurableServletWebServerFactory(){
//修改tomcat相关配置
TomcatServletWebServerFactory tomcatFactory = new TomcatServletWebServerFactory();
tomcatFactory.addConnectorCustomizers(connector -> {
((AbstractHttp11Protocol)connector.getProtocolHandler()).setMaxKeepAliveRequests(maxKeepAliveRequests);
((AbstractHttp11Protocol)connector.getProtocolHandler()).setConnectionTimeout(keepAliveTimeout);
});
return tomcatFactory;
}
}
ok! 到此就实现服务端的tomcat支持长连接,验证方式可以再linux通过netstat看下服务端tcp连接端口会不会变化,验证的前提是客户端也支持长连接。
END
以上是关于Jvm与tomcat基础优化的主要内容,如果未能解决你的问题,请参考以下文章