代码之家  ›  专栏  ›  技术社区  ›  Mike Q

为什么有些Java库在没有调试信息的情况下编译?

  •  19
  • Mike Q  · 技术社区  · 15 年前

    最近我注意到,有一些Java LIBS(JDK、JoDA时间、ITEXT)在没有一些/所有调试信息的情况下编译。本地变量信息丢失,或者本地变量信息和行号都丢失。

    这有什么原因吗?我知道它使编译后的代码更大,但我不认为这是一个特别大的考虑。或者只是使用默认的编译选项进行构建?

    谢谢。

    2 回复  |  直到 15 年前
        1
  •  34
  •   Aaron Digulla    15 年前

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

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

    正如约翰指出的,Java字节码今天不再优化。因此,两种情况下类文件的输出是相同的(只有具有调试信息的类文件才会更大)。代码在运行时在JIT中进行优化,使运行时能够为CPU、内存(数量和布局)等优化代码。

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

        2
  •  0
  •   Thorbjørn Ravn Andersen    15 年前

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

    我最近不得不研究一个Java Web启动问题——没有可用的调试信息——所以添加完整的跟踪到Java控制台并下载源代码帮助了一些代码,但是代码相当混乱,所以我只需要调试构建。

    这个 JDK 应该用所有调试信息编译!