jvm - OpenJDK 使用 printf 进行调试?

标签 jvm printf java jvm-hotspot jvm-crash

我正在破解 OpenJDK7 来实现一个算法。在执行此操作的过程中,我需要将调试信息输出到标准输出。正如我在代码库中看到的,所有打印都是通过使用 outputStream*->print_cr() 完成的。我想知道为什么根本不使用 printf() ?

我问这个问题的部分原因是因为我实际上使用了很多 printf() 调用。我一直看到一些奇怪的错误,例如随机内存损坏和随机 JVM 崩溃。我的 printf() 是否有可能是根本原因? (当然假设我的代码逻辑没有错误)

最佳答案

why printf() was not used at all?

HotSpot 不直接使用 stdio,而是利用自己的打印和日志记录框架。这个额外的抽象层具有以下优点:

  • 不仅允许打印到标准输出,还允许打印到任意流。不同的 JVM 部分可能会记录到单独的流(例如 GC 日志的专用流)。
  • 有自己的格式化和缓冲实现,不分配内存或使用全局锁。
  • 控制 JVM 发出的所有输出。例如,所有输出都可以轻松地用时间戳进行补充。
  • 便于移植到不同的平台和环境。

该框架在 JDK 9 中得到进一步改进,支持JEP 158: Unified JVM Logging .

Is there any chance that my printf() is the root cause?

不可以,除非 printf 被误用:例如参数与格式说明符不匹配,或者在信号处理程序内部调用了 printf。否则,使用 printf 进行调试是安全的。我在 HotSpot 工作时做过很多次。

关于jvm - OpenJDK 使用 printf 进行调试?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34689697/

相关文章:

C - Printf 未输出预期结果

php - 参数太少 sprintf

java - Maven 不适用于 Java SE 9,而是适用于 Java SE-1.8,为什么?

java - 如何在其他网络中存在的远程 JVM 中运行 java 文件/项目?

java - 保留对象的最新版本

c - "Freezing"控制台中的输入行并打印在上面的行上?

java - 如何打印非静态方法

java - 通过 GenericEntity<List<T>> 在 RESTful Response 对象中使用 Java 泛型模板类型

java - 在Java中,将内部本地数组提取到外部是内存效率高还是速度优势?

java - 当方法之间的差异是参数子类型时,将 null 传递给重写的方法