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的大小。

 具体参数查看: https://docs.spring.io/spring-boot/docs/current/reference/html/common-application-properties.html#common-application-properties

 

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容器的配置。

 

 



posted @ 2019-08-18 11:02  南极山  阅读(1151)  评论(0)    收藏  举报