我有什么理由应该避免在我的 Java 类中使用 Javac 编译调试信息以用于生产服务器?我应该注意任何速度或安全问题吗?
请注意,我指的是调试信息,例如堆栈跟踪中的行号,而不是记录器的调试级别。
我有什么理由应该避免在我的 Java 类中使用 Javac 编译调试信息以用于生产服务器?我应该注意任何速度或安全问题吗?
请注意,我指的是调试信息,例如堆栈跟踪中的行号,而不是记录器的调试级别。
你的意思是用调试选项编译? Javac 调试打开和关闭之间是否存在性能差异?
作为一名开发人员,我建议尽可能多地保留。推理?
有一天,你会在你的程序中遇到一个错误,你拥有的唯一信息是堆栈跟踪,并且无法通过命令重现该错误,这是原始程序员完全没有预料到的,而修复它是你的工作. 该堆栈跟踪中提供给您的信息越多越好!保留所有调试信息!
如果可以,请使用日志框架(获取文件的堆栈跟踪),该框架可以提供有关找到每个类的 jar 文件的信息。Logback 可以做到这一点,我相信 log4j 也可以。
您可能不允许包含所有这些信息,但我认为您应该首先大喊大叫,并说出于应急原因应该将其保留。
Performancewise 我相信自从 HotSpot 以来它并不重要。
如果您指的是行号信息,用于打印堆栈跟踪,那么保留它通常是一个好主意。客户可以将堆栈跟踪粘贴到错误报告中供您使用。
如果你真的担心你的方法名称是可见的,你可以使用ProGuard或其他一些混淆器。ProGuard 具有很好的特性,它可以对堆栈跟踪进行去混淆处理,因此客户仍然可以将它们发送给您。
混淆不是完美的,所以如果你不想花精力,不做也没有错。
取决于调试的过度和程序的性能敏感度。世界上 90% 的中度调试人员不必担心。
您也可以随时使用预处理器来消除代码。
我同意 BalusC 的观点,即生产中的日志级别通常可以在生产中设置为比在测试中更高(更少的输出)。我认为完全删除日志记录会适得其反。即使在生产代码中发生错误,您也需要日志信息来找出发生了什么。
Assert 语句也不是什么大问题,除非当然是在一段对性能非常敏感的代码中。您应该能够将它们完全排除在外,因为断言语句通常用于检查无法发生的事情(如果使用正确)。但是,尽管很少遇到麻烦,但实际上并没有必要将它们弄出来。
我个人认为,在生产中安装的软件应该尽可能接近开发软件,因为它已经被最频繁地测试了。