当前位置: 首页 > news >正文

【 <二> 丹方改良:Spring 时代的 JavaWeb】之 Spring Boot 中的性能优化:减少启动时间与内存占用

    <前文回顾>

点击此处查看 合集 https://blog.csdn.net/foyodesigner/category_12907601.html?fromshare=blogcolumn&sharetype=blogcolumn&sharerId=12907601&sharerefer=PC&sharesource=FoyoDesigner&sharefrom=from_link

<今日更新>

一、开篇整活儿

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

设置合适的连接池大小和超时时间,别让连接池瞎连,内存占用能稳不少。

专有名词解释

  1. 垃圾回收(GC):JVM 中的一种自动内存管理机制,用于回收不再使用的对象,释放内存空间。

写在最后

身为一个中古程序猿,我有很多自己想做的事情,比如埋头苦干手搓一个低代码数据库设计平台(目前只针对写java的朋友),已经在找朋友内测了,比如很喜欢帮身边的朋友看看简历,讲讲面试技巧,毕竟工作这么多年,也做到过高管,有很多面人经历,意见还算有用,大家基本都能拿到想要的offer...

我深刻意识到,能自由做自己喜欢的事情是有多么不容易,又是多么有成就感。所以我拉了两三个志同道合的好友,开了一间公司,继续朝着“自由”的目标前进。

当下呢,我们希望有更多的朋友能够参与到产品的测试中来,体验并且给出更好的建议。未来可能会在博客po更多关于我们产品的内容,包括使用场景、说明、课程等,希望能对大家有所帮助。

另外,想整个花活儿,每天花个1-2小时,来帮助我素未谋面的老朋友们看看简历,提提意见啥的,纯属为爱发电。我在线时间不固定,但是不要米,咱就别要自行车儿了呗~如果您有兴趣,可以点击文章底部卡片一起交流(人工回复,比较慢,请担待)。

最后,请大家持续关注我们的博客,未来还有很多栏目,一起发掘~!

(来呀~↓↓↓~老铁)

http://www.dtcms.com/a/109845.html

相关文章:

  • LogicFlow获取锚点数据的自定义key并添加的连接的Edge边数据中
  • Linux:进程信号
  • 【编程之路】动态格式化字符串
  • 【堆】《深入剖析优先级队列(堆):数据结构与算法的高效搭档》
  • KUKA机器人查看运行日志的方法
  • Layout Inspector平替跨平台布局分析器のAppium Inspector
  • NineData云原生智能数据管理平台新功能发布|2025年3月版
  • Java学习总结-递归-递归寻找文件绝对路径
  • 全连接RNN反向传播梯度计算
  • RHCSA Linux系统 指令如何使用
  • K8S学习之基础七十四:部署在线书店bookinfo
  • RuoYi-Vue-Plus 安装Minio 实现文件上传
  • 【gdutthesis模板】论文标题太长导致换页问题解决
  • CyclicBarrier、Semaphore、CountDownLatch的区别,适用场景
  • Vue3 Pinia Store使用示例
  • Linux 系统管理综合实训 —— 基于 NAT 模式的多 IP 配置、Nginx 服务部署及存储管理
  • 一周学会Pandas2 Python数据处理与分析-安装Pandas库
  • 在Vue3中格式化后端返回的Java Date类型数据为指定格式
  • 蓝桥杯真题———k倍区间
  • Android开发okhttp添加头部参数
  • 智能建造新范式:装配式建筑 4.0 的数字化进阶
  • SpringBoot集成Redis 灵活使用 TypedTuple 和 DefaultTypedTuple 实现 Redis ZSet 的复杂操作
  • Vue3 性能优化指南:从理论到实战
  • N皇后问题(dfs回溯)
  • 如何把网页文章转为pdf保存
  • 计算机网络基础:容灾备份与业务连续性保障
  • 在 Ubuntu 上离线安装 Prometheus 和 Grafana
  • GMS测试环境搭建二——aapt2报错
  • Kafka配置内外网访问(解决kafka外网访问broker超时)
  • Pytorch中预置数据集的加载方式