启用调试信息的Java代码运行速度慢多少?

启用调试信息的Java代码运行速度慢多少?,java,Java,我想知道,如果我生成的所有Java代码中都包含调试信息,那么会对性能造成多大的损失。如果没有太多的惩罚,那么我可以在需要时在生产中获取非常有用的信息,而无需重新编译。我永远不会在任何生产环境中进行调试。如果您在prod上有问题,您需要尝试在开发或测试环境中重新创建它,这是您可能调试的地方。我猜您已经将所有日志设置为最高粒度,但这并没有揭示问题?我假设您考虑的是行号和局部变量名 这两种调试添加不会向字节码添加额外的指令。因此,性能应该不会受到影响。行号和变量名只是类文件中的额外表,除非您实际调试代

我想知道,如果我生成的所有Java代码中都包含调试信息,那么会对性能造成多大的损失。如果没有太多的惩罚,那么我可以在需要时在生产中获取非常有用的信息,而无需重新编译。

我永远不会在任何生产环境中进行调试。如果您在prod上有问题,您需要尝试在开发或测试环境中重新创建它,这是您可能调试的地方。我猜您已经将所有日志设置为最高粒度,但这并没有揭示问题?

我假设您考虑的是行号和局部变量名

这两种调试添加不会向字节码添加额外的指令。因此,性能应该不会受到影响。行号和变量名只是类文件中的额外表,除非您实际调试代码,否则它们将被忽略



取决于调试的方式。如果您要将信息打印到控制台或文件,那么它肯定会占用一些性能。如果您使用的是日志API,那么也许您可以降低Qwerky提到的粒度,这应该会有所帮助。

@Bart Kiers-hint=differentstory@Andreas_D,提示在这种情况下可能有用。OP必须重新编译代码以生成调试信息。对于Log4j、slf4j或jul这样的记录器,这是生产中的配置练习。@Andreas_D,你确定吗?你和祖贝尔是同一个人吗?:)当然,我可能错了,但你也可能错。我想我的提示在这种情况下可能会有所帮助(重点是“思考”)。你是说,安德烈亚斯·德和祖贝尔是同一个人,有两个账户吗?@Bart Kiers-我绝对不会用两个不同的账户登录而浪费名誉点数;)但问题中根本没有提到“日志记录”。“调试信息”是一个编译器选项。当你说“调试”时,你如何定义它?你的意思是逐步通过调试器还是插入?@Zubair我说的是用JPDA做任何事情。是的,日志记录被提升到最高粒度,但很多日志记录根本不存在。我不会在PROD上进行调试,但有时我需要调试信息,无论是用于日志记录的(例如,异常中的行号)或反射(保留参数名称)
-g
    Generate all debugging information, including local variables. 
    By default, only line number and source file information is generated.

-g:none
    Do not generate any debugging information.

-g:{keyword list}
    Generate only some kinds of debugging information, specified by 
    a comma separated list of keywords. Valid keywords are:

    source
        Source file debugging information 
    lines
        Line number debugging information 
    vars
        Local variable debugging information