为什么某些Java库在没有调试信息的情况下进行编译


问题内容

我最近注意到,有一些Java库(JDK,joda time,iText)在编译时没有部分/全部调试信息。要么缺少局部变量信息,要么缺少局部变量信息和行号。

有什么理由吗?我意识到这会使编译后的代码更大,但我认为这不是一个特别大的考虑因素。还是仅使用默认的编译选项进行构建?

谢谢。


问题答案:

默认的编译选项不包含调试信息,您必须明确告诉编译器包括调试信息。大多数人忽略它的原因有几个:

  • 一些库用于嵌入式系统(如手机)中。直到最近,每一点都很重要。如今,大多数移动设备的内存都超过了1985年所有计算机的总和;)
  • 在激活调试的情况下进行编译时,代码的运行速度降低了5%。数量不多,但在某些情况下,每个周期都很重要。
  • 今天的高级开发人员出生于64KB RAM巨大的时代。昨天,我向地窖中的服务器添加了另一个2TB驱动器。这是25年内的7个数量级。人类需要更多时间进行调整。

[编辑]正如John指出的那样,Java字节码如今已不再(很多)优化。因此,在两种情况下,类文件的输出将相同(只有具有调试信息的类文件会更大)。该代码在运行时在JIT中进行了优化,从而使运行时可以为CPU,内存(数量和布局)等优化代码。

提到的5%罚款是在运行代码并添加命令行选项以允许远程调试器附加到进程时。如果您不启用远程调试,则不会有任何损失(除了类加载,但这只会发生一次)。