Spring boot性能优化
转载: https://blog.csdn.net/qq_37049496/article/details/8183945
1.1 扫包优化
@SpringBootApplication注解自动获取应用的配置信息,会给应用带来一些副作用。由自动配置( auto-configuration )和 组件扫描 ( component scanning )组成,这跟使用 @Configuration、@EnableAutoConfiguration 和 @ComponentScan 三个注解的作用是一样的。
这样做给开发带来方便的同时,也会有三方面的影响:
1、会导致项目启动时间变长。当启动一个大的应用程序,或将做大量的集成测试启动应用程序时,影响会特别明显。
2、会加载一些不需要的多余的实例(beans)。
3、会增加 CPU 消耗。
针对以上三个情况,我们可以移除 @SpringBootApplication 然后使用 @ComponentScan注解来扫描特定的包
//移除 @SpringBootApplication and @ComponentScan, 用 @EnableAutoConfiguration 来替代
//@SpringBootApplication
@Configuration
@EnableAutoConfiguration
@ComponentScan(basePackages = {"com.itboy.adminuiclient"})
public class App01 {
public static void main(String[] args) {
SpringApplication.run(App01.class, args);
}
}
1.2 JVM参数调优
具体的详细介绍请看我的另一片jvm参数调优, 参数设置有2种方法,
1)直接在运行时配置启动参数 ,比如:
java -XX:MetaspaceSize=128m -XX:MaxMetaspaceSize=128m -Xms1024m -Xmx1024m -Xmn256m -Xss256k -XX:SurvivorRatio=8 -XX:+UseConcMarkSweepGC -jar spboot-0.0.1-SNAPSHOT.war
-XX:MetaspaceSize=128m (元空间默认大小)
-XX:MaxMetaspaceSize=128m (元空间最大大小)
-Xms1024m (java堆最大大小)
-Xmx1024m (java堆默认大小)
-Xmn256m (新生代大小)
-Xss256k (棧最大深度大小)
-XX:SurvivorRatio=8 (新生代分区比例 8:2)
-XX:+UseConcMarkSweepGC (指定使用的垃圾收集器,这里使用CMS收集器)
-XX:+PrintGCDetails (打印详细的GC日志)
知识点:
JDK8之后把-XX:PermSize 和 -XX:MaxPermGen移除了,取而代之的是
-XX:MetaspaceSize=128m (元空间默认大小)
-XX:MaxMetaspaceSize=128m (元空间最大大小)
JDK 8开始把类的元数据放到本地化的堆内存(native heap)中,这一块区域就叫Metaspace,中文名叫元空间。
使用本地化的内存有什么好处呢?最直接的表现就是java.lang.OutOfMemoryError: PermGen 空间问题将不复存在,因为默认的类的元数据分配只受本地内存大小的限制,也就是说本地内存剩余多少,
理论上Metaspace就可以有多大(貌似容量还与操作系统的虚拟内存有关?这里不太清楚),这解决了空间不足的问题。不过,让Metaspace变得无限大显然是不现实的,
因此我们也要限制Metaspace的大小:使用-XX:MaxMetaspaceSize参数来指定Metaspace区域的大小。JVM默认在运行时根据需要动态地设置MaxMetaspaceSize的大小。
2)修改配置文件
关于修改配置文件application.properties。
SpringBoot项目详细的配置文件修改文档
其中比较重要的有:
# Maximum number of connections that the server accepts and processes at any given time. server.tomcat.max-connections=0 # Maximum size, in bytes, of the HTTP message header. server.tomcat.max-http-header-size=0 # Maximum size, in bytes, of the HTTP post content. server.tomcat.max-http-post-size=0 server.tomcat.max-threads=0 # Maximum number of worker threads. server.tomcat.min-spare-threads=0 # Minimum number of worker threads.
监控java 程序
JMX(Java Management Extensions)最常见的场景是监控Java程序的基本信息和运行情况,任何Java程序都可以开启JMX,然后使用JConsole或Visual VM进行预览
运行时添加:
java -Djava.rmi.server.hostname=192.168.2.39 -Dcom.sun.management.jmxremote -Dcom.sun.management.jmxremote.port=1099 -Dcom.sun.management.jmxremote.authenticate=false -Dcom.sun.management.jmxremote.ssl=false -jar /usr/local/data-test.jar --spring.profiles.active=dev >nohup 2>&1 &
修改配置文件:
由于启动参数过长,我们可以定义系统环境变量来表示 在/etc/profile 最后一行增加
export JAVA_OPTS='-Djava.rmi.server.hostname=192.168.2.39 -Dcom.sun.management.jmxremote -Dcom.sun.management.jmxremote.port=1099 -Dcom.sun.management.jmxremote.authenticate=false -Dcom.sun.management.jmxremote.ssl=false'
然后 source /etc/profile 是文件生效。
启动时我们就可以用 nohup java $JAVA_OPTS -jar /root/app/data-center-0.0.1-SNAPSHOT.jar --spring.profiles.active=dev >nohup 2>&1 & 这个脚本。
1.3 默认Tomcat容器改为Undertow
使用spring-boot-starter-undertow ,Tomcat的吞吐量5000左右 Undertow 8000左右 底层优化的好
本人没有测试过,可以看下这个文章 https://dev.to/azure/spring-boot-performance-benchmarks-with-tomcat-undertow-and-webflux-4d8k
springboot2.0 tomcat 优化
@Configurationpublic
public class TomcatConfig {
@Value("${tomcat.apr:false}") private boolean enabled;
@Bean public ConfigurableServletWebServerFactory webServerFactory() { TomcatServletWebServerFactory tomcatFactory = new TomcatServletWebServerFactory(); tomcatFactory.addConnectorCustomizers(new MyTomcatConnectorCustomizer());
if (enabled) { LifecycleListener aprLifecycle = new AprLifecycleListener(); tomcatFactory.setProtocol("org.apache.coyote.http11.Http11AprProtocol"); tomcatFactory.addContextLifecycleListeners(aprLifecycle); } return tomcatFactory; } class MyTomcatConnectorCustomizer implements TomcatConnectorCustomizer { public void customize(Connector connector) { if(enabled) { Http11AprProtocol protocol = (Http11AprProtocol) connector.getProtocolHandler(); //设置最大连接数 protocol.setMaxConnections(5000); //设置最大线程数 protocol.setMaxThreads(2000); protocol.setConnectionTimeout(30000); }else { Http11NioProtocol protocol = (Http11NioProtocol) connector.getProtocolHandler(); //设置最大连接数 protocol.setMaxConnections(5000); //设置最大线程数 protocol.setMaxThreads(2000); protocol.setConnectionTimeout(30000); } } }}
使用WebServerFactoryCustomizer接口替换EmbeddedServletContainerCustomizer组件完成对嵌入式Servlet容器的配置
配置代码如下:
//SpringBoot2.x.x
@Bean
public WebServerFactoryCustomizer webServerFactoryCustomizer(){
return new WebServerFactoryCustomizer<ConfigurableServletWebServerFactory>() {
@Override
public void customize(ConfigurableServletWebServerFactory factory) {
factory.setPort(8090);
}
};
}
@Component
public class EmbeddedTomcatConfig implements WebServerFactoryCustomizer<ConfigurableServletWebServerFactory> {
@Override
public void customize(ConfigurableServletWebServerFactory factory) {
(
(TomcatServletWebServerFactory)factory).addConnectorCustomizers(new TomcatConnectorCustomizer() {
@Override
public void customize(Connector connector) {
Http11NioProtocol protocol = (Http11NioProtocol) connector.getProtocolHandler();
protocol.setMaxConnections(200);
protocol.setMaxThreads(200);
protocol.setSelectorTimeout(3000);
protocol.setSessionTimeout(3000);
protocol.setConnectionTimeout(3000);
}
});
}
}
springboot2.x的相关类如下:
org.springframework.boot.web.servlet.server.ConfigurableServletWebServerFactory
org.springframework.boot.web.server.WebServerFactoryCustomizer
org.springframework.boot.web.embedded.tomcat.TomcatConnectorCustomizer
org.springframework.boot.web.embedded.tomcat.TomcatServletWebServerFactory
在WebServerFactoryCustomizer接口中使用ConfigurableWebServerFactory对象实现对customize()方法的转换,从而实现对嵌入式servlet容器的配置。

浙公网安备 33010602011771号