我最近注意到有一些 java 库(JDK、joda time、iText)在没有部分/全部调试信息的情况下编译。要么局部变量信息丢失,要么局部变量信息和行号都丢失。
这有什么原因吗?我意识到它会使编译后的代码更大,但我不认为这是一个特别大的考虑因素。或者它只是使用默认编译选项构建?
谢谢。
我最近注意到有一些 java 库(JDK、joda time、iText)在没有部分/全部调试信息的情况下编译。要么局部变量信息丢失,要么局部变量信息和行号都丢失。
这有什么原因吗?我意识到它会使编译后的代码更大,但我不认为这是一个特别大的考虑因素。或者它只是使用默认编译选项构建?
谢谢。
默认编译选项不包含调试信息,您必须明确告诉编译器包含它。大多数人忽略它有几个原因:
[编辑] 正如约翰所指出的,Java 字节码今天不再优化(很多)。所以类文件的输出对于两种情况都是一样的(只有带有调试信息的类文件会更大)。代码在运行时在 JIT 中进行优化,允许运行时针对 CPU、内存(数量和布局)等优化代码。
提到的 5% 惩罚是在您运行代码并添加命令行选项以允许远程调试器附加到进程时。如果您不启用远程调试,则不会受到任何惩罚(类加载除外,但只会发生一次)。
大概安装尺寸。调试信息增加了 Sun 可能不喜欢的 jar 文件的开销。
我最近不得不调查一个 Java Web Start 问题——没有可用的调试信息——因此向 Java 控制台添加完整的跟踪并下载源代码有所帮助,但代码相当复杂,所以我只想进行调试构建。
JDK应该在任何地方都使用完整的调试信息进行编译!