19

我最近注意到有一些 java 库(JDK、joda time、iText)在没有部分/全部调试信息的情况下编译。要么局部变量信息丢失,要么局部变量信息和行号都丢失。

这有什么原因吗?我意识到它会使编译后的代码更大,但我不认为这是一个特别大的考虑因素。或者它只是使用默认编译选项构建?

谢谢。

4

2 回答 2

35

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

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

[编辑] 正如约翰所指出的,Java 字节码今天不再优化(很多)。所以类文件的输出对于两种情况都是一样的(只有带有调试信息的类文件会更大)。代码在运行时在 JIT 中进行优化,允许运行时针对 CPU、内存(数量和布局)等优化代码。

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

于 2009-12-09T09:00:37.313 回答
0

大概安装尺寸。调试信息增加了 Sun 可能不喜欢的 jar 文件的开销。

我最近不得不调查一个 Java Web Start 问题——没有可用的调试信息——因此向 Java 控制台添加完整的跟踪并下载源代码有所帮助,但代码相当复杂,所以我只想进行调试构建。

JDK应该在任何地方都使用完整的调试信息进行编译!

于 2009-12-09T17:12:36.787 回答