为什么编译一些没有调试信息的java库

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

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

谢谢。

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

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

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

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

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

我最近不得不调查一个Java Web Start问题 – 没有可用的调试信息 – 因此向java控制台添加完整跟踪并下载源代码有所帮助,但代码相当纠结,所以我只是喜欢调试版本。

应该使用FULL调试信息编译JDK