惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

MongoDB | Blog
MongoDB | Blog
V
V2EX
让小产品的独立变现更简单 - ezindie.com
让小产品的独立变现更简单 - ezindie.com
有赞技术团队
有赞技术团队
freeCodeCamp Programming Tutorials: Python, JavaScript, Git & More
罗磊的独立博客
月光博客
月光博客
爱范儿
爱范儿
D
Docker
U
Unit 42
P
Proofpoint News Feed
I
InfoQ
腾讯CDC
OSCHINA 社区最新新闻
OSCHINA 社区最新新闻
L
LangChain Blog
V
Visual Studio Blog
IT之家
IT之家
Vercel News
Vercel News
G
Google Developers Blog
M
MIT News - Artificial intelligence
美团技术团队
The GitHub Blog
The GitHub Blog
阮一峰的网络日志
阮一峰的网络日志
MyScale Blog
MyScale Blog

kissthisrain

悲,OpenCodeGo套餐大砍 Token 用量小组件:适配 DeepSeek Harness 七月杂记 我是如何入住 InStreet 的:一个 AI Agent 的社交初体验 和OpenClaw聊着天,文章就发出去了 OpenClaw使用感受 Google Gemini体验 记笔记本开机不能自动联网的问题 关于我换掉2060S这件事:一些不成熟的显卡选购碎碎念 国庆后的第一个周末 记一次服务器负载过高的问题 职场搬迁新办公地 我的小狗 解决使用OpenVPN导致网络卡顿的问题 DICOM医学影像匿名化导致服务重启的问题 本地运行halo碰到的问题 Mybatis-Plus使用saveBatch方法不回显ID的问题 MongoDB语句(待补充) MySQL常用语句记录 windows常用命令记录 私有CI/CD平台搭建(一)Drone安装及部署 Alibaba Cloud Linux release 3安装Docker
Java项目启动时间过长的问题
kissthisrain · 2024-08-23 · via kissthisrain

问题描述:

项目启动缓慢,且中间有部分时间出现日志打印卡住的情况,极大的影响本地调试的效率

原因总结:

项目中引用了jOOQ ,导致@execution的aspectj扫描大量的实例和方法,影响项目启动速度

修改方式:

在不影响切面功能的基础上,用within代替execution,目前排查下来的只有一个针对所有controller的切面使用到了,修改掉项目启动速度由150s降到98s左右

参考:jOOQ,spring-boot and aop. · Issue #5902 · jOOQ/jOOQ (github.com)

排查过程

  1. 查看启动时的打印日志,确定下项目启动时缓慢的时间段

  2. 使用 BeanPostProcessor获取启动时加载时间大于1s的bean对象

  3. 逐步排查到dslContext的加载速度比较缓慢,直接从网上查询到相似问题,使用对应解决方案,over

import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.BeansException;
import org.springframework.beans.factory.config.BeanPostProcessor;
import org.springframework.context.annotation.Configuration;
import org.springframework.stereotype.Component;

import java.util.Objects;
import java.util.concurrent.ConcurrentHashMap;

@Component
@Configuration
@Slf4j
public class BeanCostTimePostProcessor implements BeanPostProcessor {

    /**
     * 项目启动时会执行此方法 实现了BeanPostProcessor接口,充当钩子函数,记录bean加载的时间
     */
    private static final ConcurrentHashMap<String,Long> TIME_MAP = new ConcurrentHashMap<>();



    @Override
    public Object postProcessBeforeInitialization(Object bean, String beanName) throws BeansException {
        TIME_MAP.put(beanName,System.currentTimeMillis());
        return bean;
    }

    @Override
    public Object postProcessAfterInitialization(Object bean, String beanName) throws BeansException {

        Long time = TIME_MAP.get(beanName);

        if (Objects.nonNull(time)){
            long end = System.currentTimeMillis();
            long cost = end - time;
            if (cost > 1000L) {
                log.info("=======================slow beanName:{} class path :{} , cost :{}", beanName, bean.getClass().getName(), cost);
            }
        }

        return bean;
    }

}