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

推荐订阅源

C
Check Point Blog
有赞技术团队
有赞技术团队
博客园 - 三生石上(FineUI控件)
博客园_首页
博客园 - 【当耐特】
WordPress大学
WordPress大学
月光博客
月光博客
博客园 - 叶小钗
S
SegmentFault 最新的问题
雷峰网
雷峰网
H
Help Net Security
宝玉的分享
宝玉的分享
A
About on SuperTechFans
IT之家
IT之家
J
Java Code Geeks
Hugging Face - Blog
Hugging Face - Blog
D
DataBreaches.Net
酷 壳 – CoolShell
酷 壳 – CoolShell
博客园 - 聂微东
T
The Blog of Author Tim Ferriss
B
Blog
freeCodeCamp Programming Tutorials: Python, JavaScript, Git & More
H
Hackread – Cybersecurity News, Data Breaches, AI and More
Y
Y Combinator 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;
    }

}