在大型java项目中,您使用什么工具来查找未使用的/死亡的代码?我们的产品已经开发了几年,手动检测不再使用的代码变得非常困难。但是,我们会尽量删除未使用的代码。

对于一般策略/技术(而不是特定工具)的建议也很感激。

编辑:请注意,我们已经使用了代码覆盖工具(Clover, IntelliJ),但这些帮助不大。死代码仍然有单元测试,并显示为已覆盖。我想理想的工具应该是识别那些依赖于它的其他代码很少的代码集群,从而允许手动检查文档。


当前回答

我很惊讶这里竟然没有提到ProGuard。这是目前最成熟的产品之一。

ProGuard is a free Java class file shrinker, optimizer, obfuscator, and preverifier. It detects and removes unused classes, fields, methods, and attributes. It optimizes bytecode and removes unused instructions. It renames the remaining classes, fields, and methods using short meaningless names. Finally, it preverifies the processed code for Java 6 or for Java Micro Edition. Some uses of ProGuard are: Creating more compact code, for smaller code archives, faster transfer across networks, faster loading, and smaller memory footprints. Making programs and libraries harder to reverse-engineer. Listing dead code, so it can be removed from the source code. Retargeting and preverifying existing class files for Java 6 or higher, to take full advantage of their faster class loading.

下面是列表死代码的示例:https://www.guardsquare.com/en/products/proguard/manual/examples#deadcode

其他回答

我使用Doxygen开发了一个方法调用映射来定位从未调用过的方法。在图中,您将发现没有调用者的方法集群孤岛。这对库不起作用,因为您总是需要从一些主要入口点开始。

DCD不是某些IDE的插件,但可以从ant或独立运行。它看起来像一个静态工具,它可以做PMD和FindBugs不能做的事情。我会试试的。

附注:正如下面的评论中提到的,该项目现在存在于GitHub中。

代码覆盖工具,如Emma、Cobertura和Clover,将检测您的代码,并记录通过运行一组测试调用代码的哪些部分。这是非常有用的,并且应该是开发过程中不可分割的一部分。它将帮助您确定测试套件对代码的覆盖程度。

然而,这与识别真正的死代码是不同的。它只识别被测试覆盖(或未被测试覆盖)的代码。这可能会给您带来假阳性(如果您的测试没有覆盖所有场景)和假阴性(如果您的测试访问了实际上从未在真实场景中使用过的代码)。

我认为真正识别死代码的最好方法是在实时运行的环境中使用覆盖工具,并在一段较长的时间内分析代码覆盖率。

If you are runnning in a load balanced redundant environment (and if not, why not?) then I suppose it would make sense to only instrument one instance of your application and to configure your load balancer such that a random, but small, portion of your users run on your instrumented instance. If you do this over an extended period of time (to make sure that you have covered all real world usage scenarios - such seasonal variations), you should be able to see exactly which areas of your code are accessed under real world usage and which parts are really never accessed and hence dead code.

我个人从来没有见过这样做,也不知道如何使用上述工具来检测和分析没有通过测试套件调用的代码——但我相信它们可以做到。

IntelliJ有代码分析工具,用于检测未使用的代码。你应该试着让尽可能多的字段/方法/类成为非公共的,这样会显示出更多未使用的方法/字段/类

我还会尝试找到重复的代码,作为减少代码量的一种方式。

我的最后一个建议是,尽量找到开放源代码,如果使用,会使您的代码更简单。

我在Eclipse中对单个类所做的一件事是,将它的所有方法都更改为private,然后看看我得到了什么抱怨。对于所使用的方法,这将引起错误,我将它们返回到尽可能低的访问级别。对于未使用的方法,这将引发关于未使用方法的警告,然后可以删除这些方法。作为奖励,您经常会发现一些公共方法可以而且应该被私有。

但这是非常手工的。