当前位置: 首页 > 面试题库 >

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

方权
2023-03-14
问题内容

我最近注意到,有一些Java库(JDK,joda time,iText)在编译时没有部分/全部调试信息。要么缺少局部变量信息,要么缺少局部变量信息和行号。

有什么理由吗?我意识到这会使编译后的代码更大,但我认为这不是一个特别大的考虑因素。还是仅使用默认的编译选项进行构建?

谢谢。


问题答案:

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

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

[编辑]正如John指出的那样,Java字节码如今已不再(很多)优化。因此,在两种情况下,类文件的输出将相同(只有具有调试信息的类文件会更大)。该代码在运行时在JIT中进行了优化,从而使运行时可以为CPU,内存(数量和布局)等优化代码。

提到的5%罚款是在运行代码并添加命令行选项以允许远程调试器附加到进程时。如果您不启用远程调试,则不会有任何损失(除了类加载,但这只会发生一次)。



 类似资料:
  • 我正在测试一些东西,遇到了一个奇怪的情况,当我有一个断点时,IntelliJ没有调试我的代码,如图1所示。但是当我移动断点时,工作正常。 代码: 当我在这里有我的调试点时(见图),这不起作用并给出以下错误: 错误: 连接到目标虚拟机,地址:“127.0.0.1:59776”,传输:“socket”OpenJDK 64位服务器虚拟机警告:共享仅支持引导加载程序类,因为已附加引导类路径,与目标虚拟机断

  • 问题内容: 我有一个来自客户的错误,当我查看日志时,我们跟踪异常,某些堆栈跟踪没有行号: 请注意:我已将包名称替换为“ xx”),并且所有类和方法均在我们的应用程序中定义: 完整的堆栈跟踪如下: 我对为什么会发生这样的事情很感兴趣,我的客户是否有可能对现有代码(自定义)进行某些处理? 问题答案: 不显示行号的代码是在没有调试信息的情况下编译的。

  • 我正在编写一个spring-mvc应用程序(并学习spring-mvc)。我没有向pom.xml添加servlet依赖项。当我运行或时,它会成功地完成。不是应该抛出类似“can not find javax.servlet.http.HttpServlet”这样的异常吗?它是如何编译的?

  • 问题内容: 为什么 工作,但是 不是吗 问题答案: 为了理解这一点,让我们考虑一下编译器在两种可能性下每个步骤所做的事情。让我们开始: 编译器将‘4’转换为int。所以变成 然后编译器变成 ch是一个字符,编译器可以将54转换为字符,因为它可以证明转换没有损失。 现在让我们考虑第二个版本: ch在编译时没有已知值。因此,这成为 现在,编译器无法证明此(int)的结果在char范围内可存储。因此它

  • 如果噪声对连续信道符号的影响是独立的,则可以用一组转换概率来描述。此概率就是发送符号i,收到符号j的概率。最大信道速率可用下式的最大值给出: 其中,我们改变,但保持。由拉格朗日方法可得到以下方程, 。 乘以,并针对s求得,可以证明。设的逆(如果存在的话)为,使得。则: 。 因此, 。 或: 。 这就是用于确定最大值的方程组,其中需要确定C,使得。在完成这一工作后,C为信道容量,是实现这一容量的信道

  • 我们最近在系统中遇到了一个性能问题,Logback调用了toString(),尽管指定的日志级别(DEBUG)没有为该特定的日志记录程序启用。当然,现在还有一个额外的问题是我们的toString()方法非常占用CPU,但logback的行为非常出乎意料。给定以下简单的测试案例,日志级别为mypkg。LogTest2未指定(默认),我看到toString()调用了两次,但没有打印日志消息(注意:针对