27

我刚刚为 Eclipse安装了Unnecessary Code Detector并在我的项目中运行它。我看到很多所谓的“死代码”。尽管从组织的角度来看,删除死/不必要的代码是有意义的,但它让我思考:

死代码真的会阻碍 Java 应用程序的性能吗?!?!

对我来说,如果代码真的“死”了,它永远不会被执行,所以我看不出删除它(再次,除了组织/内务/代码清理目的)如何提高性能。

4

4 回答 4

31

我不认为“死代码”会阻碍应用程序性能,但会阻碍开发性能,这总是更昂贵。

在可能的情况下,JIT 编译器可能会删除这种死代码 - 请参阅死代码消除。我想理论上如果 JIT 编译器删除了大量的死代码,它可能会影响初始编译。

但是我怀疑这会在实践中发生,我只建议删除死代码以使开发更容易/更快。

于 2013-04-29T14:26:23.733 回答
22

它可能会影响一些事情......

  • 应用程序的大小
  • 应用程序运行时使用的内存
  • 包裹扫描性能下降(如果适用)
于 2013-04-29T14:24:57.513 回答
5

它可能会对其产生一些影响,但 JIT 编译器应该能够检测和消除从未使用过的方法。即使没有,开销(内存、加载时间、JIT 编译时间等)也可能很小。

消除死方法的一个更好的理由是摆脱使您的代码库更难阅读、测试和维护的“旧东西”。如果这是您可能再次需要的代码,您总是可以从版本控制中取回它。


如果我问用户你想调用哪个方法怎么办?,将输入作为字符串,然后使用反射调用该方法?JIT 不能说将使用哪种方法,所以它不能删除任何方法:)。

好点子。所以它可能不会在实践中消除方法。(但它可以......如果类加载器知道从哪里重新加载方法......)

死方法增加了 JVM 中的方法区域。

是的,尽管内存增加的百分比可能微不足道。随之而来的性能下降可能更不显着。

此外,永远不会调用的方法永远不会被 JIT 编译,因此对于典型的实时方法,您可能不会导致 50% 或更多的内存使用。

因此,过多的死代码可能会导致从方法区域(堆)中卸载类,这可能会影响应用程序的性能。我对吗?。

这是极不可能的。一个类只有在没有引用它并且它的类加载器也无法访问时才会被卸载。而且如果真的发生了,无论如何也不会再次使用该类,因此卸载它是正确的。

于 2013-04-29T14:36:44.150 回答
1

它可能会影响您的应用程序的性能。

编辑

一种看待它的方法是;死代码将为您正在运行的应用程序添加一些额外的内存。所以它也会影响应用程序的性能。

于 2013-04-29T14:33:16.780 回答