Doris->Zuul Oom

引言 在开发者的潜意识里,LIMIT 关键字就是 SQL 查询的安全带。 我们通常认为,只要加了 LIMIT,无论表多大,数据库都只会吐出少量数据,内存就是安全的。 然而,最近的一次线上 OOM(内存溢出)事故狠狠地打破了这个认知。 一个看似人畜无害的 UNION ALL + LIMIT 组合,竟然避开了doris 的优化器的下推机制,引发了生产环境的连锁崩溃。 本文记录了这次在受限环境下,如何抽丝剥茧定位 Bug 的过程。 一、高峰期的“幽灵”崩溃 环境背景: 部署方式 Kubernetes 网关: Springboot + zuul 服务: Spring Boot + MyBatis db: Apache Doris 报错服务: 网关 java版本: jdk8, g1 权限: 无root权限,只能查看基本日志 网关pod报错关键日志 netflix.zuul.exception.ZuulException: Filter threw Exception postModifyResponseBodyFilter.run ... Caused by: java.lang.OutOfMemoryError: Java heap space 报错日志关键字: oom 二、 真相误判:GC 的烟雾弹 面对 OOM,作为 Java 开发者的第一直觉往往是:“是不是流量太大,垃圾回收(GC)跟不上了?” 查看存活期间的 JVM 监控,发现 Old Gen(老年代)增长迅速。当时的判断是:CMS 回收器产生内存碎片,导致大对象分配失败。 ...

December 12, 2025 · FXIO

Spring-动态替换Bean

Spring-动态替换Bean 问题 假如spring-boot项目引用了第三方库, 里面有个类通过autowire引用了:testService, 如何修改testService里面的实现逻辑呢? 通过动态替换testService为自定义的bean可以实现这个功能 实现原理 添加一个新的TestService2与原testService实现同样的接口 添加一个组件实现: BeanDefinitionRegistryPostProcessor 使用BeanDefinitionRegistry动态替换bean 代码示例 @Component public class MyBeanProcessor implements BeanDefinitionRegistryPostProcessor { @Override public void postProcessBeanDefinitionRegistry(BeanDefinitionRegistry registry) throws BeansException { final String beanName = "testService"; if (registry.containsBeanDefinition(beanName)) { registry.removeBeanDefinition(beanName); GenericBeanDefinition beanDefinition = new GenericBeanDefinition(); beanDefinition.setBeanClass(TestService2.class); registry.registerBeanDefinition(beanName, beanDefinition); } } @Override public void postProcessBeanFactory(ConfigurableListableBeanFactory factory) throws BeansException { } }

January 5, 2023 · FXIO