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

Mik*_*e Q 19 java compilation debug-symbols

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

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

谢谢.

Aar*_*lla 34

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

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

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

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

  • 是的,今天,Java代码在运行时进行了优化.5%速度惩罚实际上是*运行*带有附加远程调试器选项的代码. (7认同)
  • @iAn:在Java中,使用优化进行编译通常是毫无意义的 - IIRC他们要么删除了选项,要么将其作为无操作.您不会失去性能,因为优化是由JIT执行的. (2认同)