2009-12-09 47 views
19

我最近注意到有几个java库(JDK,joda time,iText)没有一些/所有的调试信息。局部变量信息丢失,或者局部变量信息和行号都丢失。为什么一些java库没有调试信息编译

这是否有任何理由?我意识到它使编译的代码更大,但我不认为这是一个特别大的考虑因素。或者它只是建立在默认的编译选项上?

谢谢。

+0

通常情况下,您应该能够下载lib的未优化/“可调试”版本,或者您可以咬下子弹并自己下拉src – Ian 2009-12-09 09:06:40

回答

34

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

  • 某些库被用于嵌入式系统(如手机)。直到最近,每一点都算在内。今天,大多数移动设备的内存都比1985年的所有计算机都多;
  • 在调试活动时编译时,代码运行速度降低了5%。没有太多,但再次,在某些情况下,每个周期都很重要
  • 今天的高级开发人员出生在64KB内存非常庞大的时代。昨天,我又在地下室的另一台服务器上增加了2TB硬盘。这是25年来的7个数量级。人类需要更多时间进行调整。

正如John指出的那样,Java字节码在今天已经不再被优化(很多)了。所以对于这两种情况,类文件的输出将是相同的(只有带调试信息的类文件会更大)。该代码在JIT运行时进行了优化,允许运行时为CPU优化代码,内存(数量和布局)等。

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

+0

此外,当您在调试时编译你也可以在不优化代码的情况下进行编译(否则行号将毫无意义),所以你会失去(静态/最终/私有)方法/属性的性能优势 – Ian 2009-12-09 09:05:03

+2

@iAn:在Java中,使用优化进行编译是总之毫无意义 - IIRC他们已经取消了这个选项,或者让它变成了一个无效的选项。您不会失去性能,因为优化是由JIT执行的。 – 2009-12-09 09:10:44

+7

是的,今天,Java代码在运行时进行了优化。 5%的速度惩罚实际上是在*运行附带远程调试器选项的代码时。 – 2009-12-09 09:52:16

0

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

我最近研究一个Java Web Start的问题 - 没有调试信息可用 - 所以加满跟踪到java控制台和下载源代码帮助一些,但代码是相当纠结所以我只是想调试建立。

JDK应该随处编译FULL调试信息!

+0

FYI有一个包含调试信息的JDK6u18 DEBUG jar。它比替代品大20mb左右。看到这里:http://download.java.net/jdk6/ – 2010-01-13 01:27:07

相关问题