Azul在2026年初发布了State of Java Survey & Report,调查了全球超过2,000名Java专业人士。报告中有两组数据格外刺眼:63%的受访者说死代码和未使用代码拖慢了团队生产力,56%每周甚至每天都要处理Java相关的CVE(通用漏洞和暴露)安全告警。
更扎心的是第三组数据:近三分之一的团队,把超过一半的时间花在调查安全扫描器的误报上——这些告警指向的库虽然在代码库中存在,但从未在生产环境中执行。
三组数据指向同一个问题:Java团队的时间正在被三类"看不见的成本"吞噬——死代码的维护负担、CVE告警的响应疲劳、误报带来的无效劳动。

死代码:不是删不掉,是不敢删
死代码是技术债中最隐蔽的一种。它不导致编译错误,不引发运行时异常,但它持续消耗团队的时间。
死代码的代价是多层面的。每次代码搜索都要扫描这些永远不会被执行的文件,拖慢IDE响应和构建速度。每次依赖分析都要处理这些代码引用的库——而这些库可能已经存在安全漏洞,需要升级或替换。每次新人入职都要花时间理解这些代码的逻辑——然后发现它根本不会被调用。
63%的团队被死代码拖慢,但删起来却异常困难。原因在于:判断一段代码"死没死"需要追踪整个调用链。一个public方法可能被其他模块通过反射调用,一个Bean可能被Spring的依赖注入在运行时加载,一个工具类可能被某个测试用例引用。没有全项目的静态分析,手动删除死代码的风险高于保留它。
这就形成了一个悖论:死代码越多,删除的难度越大;删除难度越大,死代码积累越多。团队对重构产生畏惧心理,宁愿留着不敢动,也不愿冒险删除。
CVE告警:不是漏洞多,是噪音太大
56%的团队每周处理Java CVE告警,这个数字在2025年还是41%。一年内上升了15个百分点,反映出Java生态的依赖链越来越长、安全漏洞的披露频率越来越高。
但真正的问题不在漏洞数量,而在告警信噪比。一个典型的Java项目依赖几百个第三方库,每个库都可能在不同版本中存在不同的CVE。安全扫描器(如OWASP Dependency-Check、Snyk、Trivy)会扫描所有依赖,生成一份包含数十甚至上百条告警的报告。
问题是,其中大量告警是误报。你的项目依赖了commons-collections 3.2.1,扫描器报出了CVE-2015-7501(著名的Java反序列化漏洞)。但你的项目从来没有使用过InvokerTransformer类——这个类是漏洞的触发路径。扫描器不知道你的代码有没有调用它,它只看到了依赖树中存在这个版本。
30%的团队花超过一半时间调查误报。工程师打开告警,追踪调用链,确认这个有漏洞的类或方法没有被使用,然后标记为"误报"或"可忽略"。下一个告警,重复同样的流程。这不是安全工作,这是体力劳动。
更隐蔽的代价是告警疲劳。当告警数量超过处理能力,团队会开始忽略所有告警——包括真正需要修复的那些。安全告警的"狼来了"效应,比没有告警更危险。
时间浪费的根源:分析能力不足
三组数据背后有一个共同的结构性问题:团队缺乏在代码库层面做精准分析的能力。
死代码的识别需要全项目级别的静态分析——追踪调用链、分析依赖关系、检测反射引用。CVE误报的排除需要同样的能力——追踪有漏洞的类是否被调用、有漏洞的方法是否被执行。两者本质上都是"代码可达性分析"问题:这段代码/这个依赖,在生产运行时是否真正被触达。
传统工具做这件事的效率有限。人工追踪调用链在大型项目中不现实,通用安全扫描器只能做到"依赖树级别"的告警,做不到"调用路径级别"的精确判断。这就是为什么63%的团队被死代码拖慢,30%的时间花在误报上——不是不努力,而是工具不够精准。
用AI工具做精准分析
这个问题的解法方向是明确的:用AI驱动代码库级别的深度分析,替代人工逐条追踪。
以飞算JavaAI的AI工具箱为例,它提供的几个工具直接对应这三类时间浪费:
Java整洁器针对死代码问题。它扫描全项目的冗余代码——未使用的方法、未引用的类、不可达的代码分支。更重要的是,它结合Checkstyle规则做规范违规修复,扫描SAST(静态应用安全测试)问题。这意味着死代码清理和规范修复可以在同一次扫描中完成,不需要分开操作。
Java安全修复器针对CVE告警问题。它检测OWASP Top 10漏洞,但它的检测不是依赖树级别的——而是代码级别的。它扫描的是项目中实际使用到的代码路径,而非整个依赖树。这可以大幅减少"依赖存在但代码未调用"的误报。
Jar依赖修复器针对依赖管理问题。它处理四类依赖问题:版本冲突(多个版本共存)、冗余依赖(声明了但未使用)、过期依赖(有新版本可用)、安全漏洞(当前版本有已知CVE)。它做的是全项目级别的依赖健康检查,输出的不是"这里有漏洞"的告警,而是"应该升级到哪个版本"的具体建议。

这三个工具的共同价值在于:把"发现问题"和"修复问题"合并到一个流程中。传统模式下,发现问题用扫描器,修复问题靠人工。AI工具把修复也纳入了自动化——扫描出冗余代码可以直接清理,扫描出安全漏洞可以直接修复,扫描出版本冲突可以直接给出升级建议。
结语
63%被死代码拖慢,56%每周处理CVE,30%时间花在误报上——这三组数据描述的不是个别团队的效率问题,而是Java生态的结构性痛点。依赖链越来越长、安全披露越来越频繁、代码库越来越庞大,传统的"扫描+人工排查"模式已经跟不上节奏。
解法不是更频繁地扫描,也不是雇更多人做告警排查,而是引入能在代码库级别做精准分析的工具。AI驱动的代码分析工具——无论是整洁器清理死代码、安全修复器精准检测漏洞、还是依赖修复器管理版本健康——都在把"发现问题"和"修复问题"之间的鸿沟填上。
当工具能做到"告警即修复"而非"告警等人工",被浪费的那30%时间才能真正回到工程价值创造上。
168

被折叠的 条评论
为什么被折叠?



