<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:content="http://purl.org/rss/1.0/modules/content/"><channel><title>Db on FXIO 技术博客</title><link>http://fxio.site/tags/db/</link><description>Recent content in Db on FXIO 技术博客</description><generator>Hugo -- 0.157.0</generator><language>zh-cn</language><lastBuildDate>Fri, 12 Dec 2025 21:21:11 +0800</lastBuildDate><atom:link href="http://fxio.site/tags/db/index.xml" rel="self" type="application/rss+xml"/><item><title>Doris-&gt;Zuul Oom</title><link>http://fxio.site/posts/java/doris-zuul-oom/</link><pubDate>Fri, 12 Dec 2025 21:21:11 +0800</pubDate><guid>http://fxio.site/posts/java/doris-zuul-oom/</guid><description>&lt;h2 id="引言"&gt;引言&lt;/h2&gt;
&lt;p&gt;在开发者的潜意识里，&lt;code&gt;LIMIT&lt;/code&gt; 关键字就是 SQL 查询的安全带。
我们通常认为，只要加了 &lt;code&gt;LIMIT&lt;/code&gt;，无论表多大，数据库都只会吐出少量数据，内存就是安全的。&lt;/p&gt;
&lt;p&gt;然而，最近的一次线上 OOM（内存溢出）事故狠狠地打破了这个认知。
一个看似人畜无害的 &lt;code&gt;UNION ALL&lt;/code&gt; + &lt;code&gt;LIMIT&lt;/code&gt; 组合，竟然避开了doris 的优化器的下推机制，引发了生产环境的连锁崩溃。&lt;/p&gt;
&lt;p&gt;本文记录了这次在受限环境下，如何抽丝剥茧定位 Bug 的过程。&lt;/p&gt;
&lt;h2 id="一高峰期的幽灵崩溃"&gt;一、高峰期的“幽灵”崩溃&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;环境背景：&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;部署方式&lt;/strong&gt; Kubernetes&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;网关：&lt;/strong&gt; Springboot + zuul&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;服务：&lt;/strong&gt; Spring Boot + MyBatis&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;db：&lt;/strong&gt; Apache Doris&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;报错服务：&lt;/strong&gt; 网关&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;java版本：&lt;/strong&gt; jdk8, g1&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;权限：&lt;/strong&gt; 无root权限,只能查看基本日志&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;网关pod报错关键日志&lt;/strong&gt;&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-java" data-lang="java"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;netflix&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;zuul&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;exception&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;ZuulException&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;Filter&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;threw&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;Exception&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;postModifyResponseBodyFilter&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;run&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;...&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;Caused&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;by&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;java&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;lang&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;OutOfMemoryError&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;Java&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;heap&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;space&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;报错日志关键字: oom&lt;/p&gt;
&lt;h2 id="二-真相误判gc-的烟雾弹"&gt;二、 真相误判：GC 的烟雾弹&lt;/h2&gt;
&lt;p&gt;面对 OOM，作为 Java 开发者的第一直觉往往是：“是不是流量太大，垃圾回收（GC）跟不上了？”
查看存活期间的 JVM 监控，发现 Old Gen（老年代）增长迅速。当时的判断是：CMS 回收器产生内存碎片，导致大对象分配失败。&lt;/p&gt;</description></item></channel></rss>