使用mvn spring-boot:run启动Spring Boot应用远慢于java -jar的问题
补全JVM优化参数
mvn spring-boot:run默认使用的JVM参数比较保守,堆内存、GC配置未针对大数据量处理优化,180万条数据转POJO时容易触发频繁垃圾回收,直接拖慢速度。
你可以在pom.xml里给spring-boot-maven-plugin添加JVM参数:<plugin> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-maven-plugin</artifactId> <configuration> <jvmArguments>-Xmx4G -Xms2G -XX:+UseG1GC</jvmArguments> </configuration> </plugin>或者临时运行时指定参数:
mvn spring-boot:run -Dspring-boot.run.jvmArguments="-Xmx4G -Xms2G"消除DevTools的性能影响
如果项目引入了spring-boot-devtools依赖,mvn spring-boot:run会自动启用热重启功能,它使用的RestartClassLoader会禁用部分JIT编译优化,类加载逻辑也更复杂,大数据量处理时性能会明显下降。
解决办法要么直接移除devtools依赖,要么运行时指定生产环境禁用它:mvn spring-boot:run -Dspring-boot.run.profiles=prod(前提是prod配置里已排除devtools)。调整插件的fork模式
默认spring-boot:run会fork新进程运行应用,但fork配置异常可能导致类路径重复加载或JVM参数继承问题。
可以临时关闭fork测试:<plugin> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-maven-plugin</artifactId> <configuration> <fork>false</fork> </configuration> </plugin>注意:关闭fork后Maven自身的类加载可能影响应用,测试完成后再决定是否保留该配置。
核对数据库配置一致性
不同启动方式可能加载了不同配置文件,比如Maven启动用默认配置,而java -jar用生产配置,导致JDBC的fetchSize设置过小,数据库每次返回的数据量少,IO次数暴增。
检查所有配置文件中的数据库参数,确保fetchSize设置合理(比如MySQL可设为1000以上),同时确认MyBatis/JPA这类ORM框架的批量处理配置在各环境下一致。清理重复依赖
mvn spring-boot:run的类路径包含Maven所有依赖,可能存在重复的JDBC驱动、ORM框架包,导致类加载冲突或反射性能下降。
用mvn dependency:tree命令排查重复依赖,将冗余依赖排除,保证类路径干净。
内容的提问来源于stack exchange,提问作者Georgi

