【问题标题】:Why are some java libraries compiled without debugging information为什么有些java库编译时没有调试信息
【发布时间】:2009-12-09 08:54:40
【问题描述】:

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

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

谢谢。

【问题讨论】:

  • 通常情况下,您应该能够下载未优化/“可调试”的 lib 版本,或者您可以硬着头皮自己拉下 src

标签: java compilation debug-symbols


【解决方案1】:

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

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

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

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

【讨论】:

  • 此外,当您在启用调试的情况下进行编译时,您也会在未优化代码的情况下进行编译(否则行号将毫无意义),因此您会失去 (static / final) 的性能优势/private) 方法/属性
  • @iAn:在 Java 中,使用优化进行编译通常是毫无意义的——IIRC 他们要么删除了该选项,要么将其设为无操作。您不会失去性能,因为优化是由 JIT 执行的。
  • 是的,今天,Java 代码在运行时进行了优化。 5% 的速度损失实际上是在运行带有附加远程调试器选项的代码时。
  • +1。但是对于高级开发人员和他们的 64K 内存的双关语很容易。我是一名年轻高级开发人员,我仍然关心那些 kB 和周期(不是每一个,但如果你能将它们中的很大一部分切掉......):)
【解决方案2】:

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

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

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

【讨论】:

  • 仅供参考,有一个 JDK6u18 的 DEBUG jar,其中包含调试信息。它比替代方案大 20mb 左右。见这里:download.java.net/jdk6
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-11-23
  • 2015-03-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多