“死”代码会影响Java应用程序的性能吗?

27

我刚刚安装了Eclipse的Unnecessary Code Detector插件并在我的项目上运行了它。我看到了很多所谓的“死代码”。虽然从组织角度来看,删除死代码是有意义的,但这让我思考:

死代码是否会实际影响Java应用程序的性能?!?!

对于我来说,如果代码确实是“死”的,它永远不会被执行,因此我不明白除了组织/清理代码目的之外,删除它如何能够提高性能。


3
如果你在进行任何形式的反思,它可能会减缓这个过程。 - Pace
一个有趣的问题是:不必要的方法是否会导致不必要的导入。 - Richard Tingle
1
简短回答是肯定的。但性能问题需要用不同的方式解决,这是一个完全不同的问题。 - Siddharth
5
我也是一个代码收集者,但无用的代码应该在版本控制系统中被删除或复制到个人代码库中。它会妨碍程序员的表现,与应用性能相比,这样做会浪费金钱。 ;) - Joop Eggen
@emory 很好的观点。如果您使用任何类型的AOP框架或使用反射的框架,情况也是如此。 - Pace
显示剩余5条评论
4个回答

31

我认为“死代码”不会影响应用程序的性能,但会阻碍开发速度,这无疑更加昂贵。

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

但是我怀疑实际情况下不会发生这种事情,并且我只建议删除死代码以使开发更加轻松/快速。


1
我对“阻碍开发性能”没有异议,但是你有什么依据来支持“不认为‘死代码’会影响应用程序性能”吗? - nhahtdh
1
如果JIT编译器将其删除,我认为这不是问题。 - Joe Ratzer
然而,我确保说“想”,因为我更愿意自己测试以确保它不会减慢代码。 - Joe Ratzer
6
+1表示同意:“我认为“死代码”不会影响应用程序的性能,但它会影响开发效率,而这通常更加昂贵。” - Max Charas
1
编译器会删除程序中从未使用过的public方法吗?我怀疑不会,因为理论上公共方法仍然可以通过反射访问。 - Viliam Búr
1
@ViliamBúr 私有方法仍然可以通过反射访问。 - emory

22

这可能会影响几个方面...

  • 应用程序的大小
  • 应用程序运行时使用的内存
  • 包扫描的性能下降(如果适用)

谢谢@Webnet (+1) - 我还不明白为什么死代码在应用程序运行时会占用堆内存。你能详细解释一下吗?再次感谢! - user1768830
2
@TicketMonster - 我认为一个正在运行的应用程序需要保持某种对象的“索引”,以便在导入它们时知道它们的存在和位置。尽管占用空间很少,但根据您拥有的“死代码”量,这可能会累积。 - Ben
再次感谢@Webnet(再加1)-您能指出JVM文档(或其他任何地方)中的具体内容以便跟进吗? - user1768830
@TicketMonster - http://www.securingjava.com/chapter-two/chapter-two-7.html 是一个好的阅读材料,如果你需要更简要的版本,请访问https://dev59.com/FGjWa4cB1Zd3GeqPnRly - Ben

5
它可能会对其产生一些影响,但JIT编译器应该能够检测和消除从未使用的方法。即使它没有,开销(内存,加载时间,JIT编译时间等)也很小。
消除死方法的一个更好的原因是摆脱“旧东西”,这使您的代码库更难阅读、测试和维护。如果这是您可能需要再次使用的代码,则可以始终从版本控制中获取它。
如果我问用户想调用哪个方法?,将输入作为字符串并使用反射调用该方法呢?JIT无法确定将使用哪种方法,因此无法删除任何方法:)。
好主意。因此,实际上它可能不会消除方法。(但如果类加载器知道从哪里重新加载方法,它就可能......)
死方法会增加JVM中的方法区域。
是的,尽管百分比内存增加可能微不足道。因此导致的性能降低可能更不重要。
此外,从不调用的方法永远不会进行JIT编译,因此对于典型实时方法,您可能不会增加50%或更多的内存使用量。
那么太多的死代码可能会导致从方法区域(堆)卸载类,这可能会影响应用程序性能。我是正确的吗?。
这是极不可能的。仅当没有引用它且其类加载器也不可达时,才会卸载类。如果确实发生了这种情况,则该类将不会再次使用,因此正确卸载它。

1
JIT编译器应该能够检测和消除方法。如果我询问用户“您想调用哪个方法?”,将输入作为字符串并使用反射调用该方法,那会怎样呢?JIT无法确定将使用哪种方法,因此无法删除任何方法 :)。死代码会增加JVM中的方法区域。因此,过多的死代码可能会导致从方法区域(堆)卸载类,这可能会影响应用程序性能。我是对的吗?PS:我很抱歉同时“试图回答”和“提出问题”。 :( - TheLostMind

1
可能会影响您的应用程序性能。 编辑 其中一种看待它的方式是:死代码将增加正在运行的应用程序的一些额外内存。因此,它也将影响应用程序性能。

3
如果代码从未执行,它不会使用任何堆内存,只会使用PermGen(用于存储编译代码)。 - user330315
同意,我有点过于急躁了。感谢你的纠正,我已经更新了我的答案。 - rai.skumar
谢谢@rai.skumar (+1) - 所有编译的代码都存储在PermGen中?那代码缓存呢? - user1768830
如果“性能”被认为是执行速度(我在这里假设),那么一个位静态内存如何影响性能(除了边缘情况)? - Mike Lischke

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接