<前文回顾>
<今日更新>
一、开篇整活儿
Spring Boot 这玩意儿,用过的都知道,方便是真方便,但有时候启动慢得像蜗牛爬,内存占得跟吃大户似的。咱今儿个就唠唠咋整能让它跑得快点儿,少吃点儿内存。别整那些花里胡哨的,直接上干货,咱不整虚的。
二、启动时间优化
1. 懒加载,别一股脑儿全上
Spring Boot 启动的时候,默认会把所有的 Bean 都加载一遍,这就像你吃饭,一口还没咽下去,下一口又塞进来了,能不噎着吗?所以,咱得学会“懒加载”。
Java Code |
@Lazy @Service public class MyService { // 业务代码 } |
用了 @Lazy 注解,Spring 就会等到真正用的时候才加载这个 Bean,启动的时候就能省不少时间。
2. 别啥都往 @ComponentScan 里塞
@ComponentScan 这玩意儿,默认会扫描整个包路径,有时候你根本用不着那么多 Bean,它还非得给你扫一遍。这就像你找对象,非得把全村的人都见一遍,累不累啊?
Java Code |
@ComponentScan(basePackages = {"com.example.necessary"}) |
指定一下必要的包路径,别让它瞎扫。
3. 别让 Spring Boot 自己瞎猜配置
Spring Boot 有个自动配置的功能,虽然方便,但有时候它会给你整一堆你用不着的配置。这就像你去饭店,服务员非得给你推荐一堆你不想吃的菜。
Java Code |
@SpringBootApplication(exclude = {DataSourceAutoConfiguration.class}) |
用 exclude 把不需要的自动配置类排除掉,启动速度能快不少。
三、内存占用优化
1. 别让 JVM 自己瞎折腾
JVM 的内存管理有时候挺不靠谱的,你得自己动手调教调教。比如,设置一下堆内存的大小:
bash Code |
java -Xms512m -Xmx1024m -jar myapp.jar |
-Xms 是最小堆内存,-Xmx 是最大堆内存。别让 JVM 自己瞎折腾,手动设置一下,内存占用能稳不少。
2. 别让 GC 瞎忙活
垃圾回收(GC)[1] 是 JVM 的一个重要机制,但有时候它会瞎忙活,搞得系统卡顿。你可以选择合适的 GC 算法,比如 G1 GC:
bash Code |
java -XX:+UseG1GC -jar myapp.jar |
G1 GC 适合大内存应用,能减少 Full GC 的频率,内存占用也能稳当不少。
3. 别让线程池瞎搞
Spring Boot 里用线程池的地方不少,但线程池配置不当,内存占用能蹭蹭往上涨。比如,ThreadPoolTaskExecutor 的配置:
Java Code |
@Bean public ThreadPoolTaskExecutor taskExecutor() { ThreadPoolTaskExecutor executor = new ThreadPoolTaskExecutor(); executor.setCorePoolSize(10); executor.setMaxPoolSize(20); executor.setQueueCapacity(50); executor.setThreadNamePrefix("MyExecutor-"); executor.initialize(); return executor; } |
设置合适的核心线程数、最大线程数和队列容量,别让线程池瞎搞,内存占用能稳不少。
四、其他骚操作
1. 别让日志瞎打
日志这玩意儿,打多了占内存,打少了又怕出问题找不到原因。所以,得有个度。比如,用 Logback 配置一下日志级别:
XML Code |
<logger name="com.example" level="INFO"/> <root level="WARN"> <appender-ref ref="STDOUT"/> </root> |
把不必要的日志级别调高,减少日志输出,内存占用能少不少。
2. 别让缓存瞎存
Spring Boot 里用缓存的地方不少,但缓存配置不当,内存占用能蹭蹭往上涨。比如,用 Caffeine 配置一下缓存:
Java Code |
@Bean public CacheManager cacheManager() { CaffeineCacheManager cacheManager = new CaffeineCacheManager(); cacheManager.setCaffeine(Caffeine.newBuilder() .expireAfterWrite(10, TimeUnit.MINUTES) .maximumSize(100)); return cacheManager; } |
设置合适的缓存过期时间和最大缓存数量,别让缓存瞎存,内存占用能稳不少。
3. 别让数据库连接池瞎连
数据库连接池配置不当,内存占用能蹭蹭往上涨。比如,用 HikariCP 配置一下连接池:
Yml Code |
spring: datasource: hikari: maximum-pool-size: 10 minimum-idle: 2 idle-timeout: 30000 max-lifetime: 1800000 |
设置合适的连接池大小和超时时间,别让连接池瞎连,内存占用能稳不少。
专有名词解释
- 垃圾回收(GC):JVM 中的一种自动内存管理机制,用于回收不再使用的对象,释放内存空间。
写在最后
身为一个中古程序猿,我有很多自己想做的事情,比如埋头苦干手搓一个低代码数据库设计平台(目前只针对写java的朋友),已经在找朋友内测了,比如很喜欢帮身边的朋友看看简历,讲讲面试技巧,毕竟工作这么多年,也做到过高管,有很多面人经历,意见还算有用,大家基本都能拿到想要的offer...
我深刻意识到,能自由做自己喜欢的事情是有多么不容易,又是多么有成就感。所以我拉了两三个志同道合的好友,开了一间公司,继续朝着“自由”的目标前进。
当下呢,我们希望有更多的朋友能够参与到产品的测试中来,体验并且给出更好的建议。未来可能会在博客po更多关于我们产品的内容,包括使用场景、说明、课程等,希望能对大家有所帮助。
另外,想整个花活儿,每天花个1-2小时,来帮助我素未谋面的老朋友们看看简历,提提意见啥的,纯属为爱发电。我在线时间不固定,但是不要米,咱就别要自行车儿了呗~如果您有兴趣,可以点击文章底部卡片一起交流(人工回复,比较慢,请担待)。
最后,请大家持续关注我们的博客,未来还有很多栏目,一起发掘~!
(来呀~↓↓↓~老铁)