2016-01-09 65 views
0

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

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

+0

你为什么要破解旧版本的OpenJDK?这是出于历史原因吗? –

+0

没有特别的理由。你会推荐OpenJDK8而不是7? –

+1

我建议你再开发一个最新的Java 8或9的Java当前版本。大约一年前,Oracle放弃了Java 7的公共版本。 –

回答

2

为什么printf()根本没用?

HotSpot不是直接使用stdio,而是利用自己的打印和记录框架。这个额外的抽象层提供以下好处:

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

该框架在JDK 9中进一步改进以支持JEP 158: Unified JVM Logging

有没有可能我的printf()是根本原因?

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