我是否应该避免在Java类中使用Javac编译调试信息以便在生产服务器中使用?我应该注意哪些速度或安全问题?
请注意,我指的是调试信息,如堆栈跟踪中的行号,而不是记录器的调试级别。
答案 0 :(得分:8)
您的意思是使用调试选项进行编译吗? Is there a performance difference between Javac debug on and off?
答案 1 :(得分:5)
作为一名开发人员,我建议尽可能多地离开。推理?
有一天,你会在你的程序中遇到一个错误,你所拥有的 ONLY 信息是一个堆栈跟踪,并且错误无法在命令中重现,它完全是原来的意外程序员,修复它是你的工作。在该堆栈中可用的信息越多越好!保留所有调试信息!
如果可以,则使用日志框架(将堆栈跟踪记录到文件中),该框架可以提供有关找到每个类的jar文件的信息。 Logback可以做到这一点,我相信log4j也可以。
你可能不会允许包含所有这些信息,但我相信你应该首先大叫并尖叫,并说它应该留在应急原因中。
Performancewise我相信,因为HotSpot它并不重要。
答案 2 :(得分:3)
如果您的意思是行号信息,对于打印堆栈跟踪,那么保持这一点通常是一个好主意。客户可以在错误报告中粘贴堆栈跟踪,供您使用。
如果您真的担心可见的方法名称,可以使用ProGuard或其他混淆器。 ProGuard具有很好的特性,它可以对堆栈跟踪进行去混淆,因此客户仍然可以将它们发送给您。
混淆不是很完美,所以如果你不想花费精力,没有做错就没有错。
答案 3 :(得分:0)
取决于程序的调试过度和性能敏感度。世界上90%的中等调试者不必担心。
您始终可以使用预处理器来消除代码。
答案 4 :(得分:0)
我同意BalusC的观点,即生产中的loglevels通常可以设置得更高(产量更低),而不是测试。我认为完全删除日志记录会产生反作用。即使在生产中也会发生代码错误,并且您需要日志信息以查明发生的情况。
Assert语句也不是什么大问题,除非在一段性能敏感的代码中。您应该能够将它们完全保留,因为断言语句通常用于检查不会发生的事情(如果使用正确)。但是,通过麻烦,尽可能地解决它们并不是真的有必要。
我个人认为,在生产中安装的软件应该尽可能接近开发软件,因为它经常被测试。