【问题标题】:Eclipse and Command Line's Java output differsEclipse 和命令行的 Java 输出不同
【发布时间】:2009-08-13 14:11:54
【问题描述】:

如果我从 Eclipse IDE 的输出运行的 Java 程序与我在 Windows (XP) 中的命令行执行相同操作时得到的不同,是否有任何明显的原因?我正在使用 JDK 1.6.0_04 和 Eclipse 3.4.0

程序创建线程,然后测试锁定算法。在 Eclipse 中,线程不会相互干扰。但是,使用 javac,线程会相互中断。

【问题讨论】:

  • 请提供更多信息:究竟有多“不同”?
  • 可能有很多东西,不同的 JVM,影响线程输出的调试,不同的日志设置和/或日志级别

标签: java eclipse command-line compilation


【解决方案1】:

可能导致不同行为的一件事是,如果您有 ie。两个提供相同功能的罐子(即同一个罐子的两个版本)。根据您指定类路径的方式,一个 jar 中的代码可以覆盖另一个。

现在在 Eclipse 中的顺序可能与命令行不同 - 因此您实际上调用不同的代码会导致不同的输出。

【讨论】:

  • 保留 Eclipse 生成的类路径信息似乎是要走的路。
【解决方案2】:

如果您使用线程,控制台输出可能会因机器而异,我确信 eclipse 会以某种方式影响线程。

【讨论】:

    【解决方案3】:

    我的印象是 Eclipse 有自己的内置编译器(Google 搜索证实我是对的)。它的编译方式与 javac 可能存在细微差别。

    【讨论】:

      【解决方案4】:

      是的,也许 Eclipse 启用了 JAVA 选项,例如详细垃圾收集或其他东西。您通常可以使用 [jre]/bin/Jconsole.exe 连接到 JVM,以查看 JVM 上启用了什么,然后进行比较。这将向您展示类路径以及其他方面的差异。要使其正常工作,您需要将其作为启动选项添加到要检查的 jvm:
      -Dcom.sun.management.jmxremote

      【讨论】:

        【解决方案5】:

        您确定在必要时正确同步了线程吗?

        线程是否相互依赖?如果是这样,这可能是导致行为差异的一个原因。

        尝试分析您的程序。如果线程 1 比线程 2 更快地完成,程序会工作吗?如果线程 2 完成的速度比线程 1 快,程序会运行吗?

        例如,如果线程 1 生成一个稍后将由线程 2 使用的结果。是否可以保证线程 2 在生成该结果之前不会尝试使用该结果? (假设线程 2 运行得非常快)

        总结:如果程序不同步,则不同的相对执行时间可能是导致行为差异的原因

        【讨论】:

          【解决方案6】:

          我假设你说“线程相互中断”你的意思是两个线程的输出是穿插的。我还想象你正在写 System.err 或 System.out。

          我相信您所看到的是两个线程对同一流进行非同步输出的结果。在 Eclipse 中,您正在写入的流具有足够的缓冲,因此对 write() 的调用不会停止(99.9% 的时间)。相比之下,当您从命令行运行时,很可能每个 Java write() 调用都会导致一个 write 系统调用,从而停止一个线程并调度另一个线程。事实上,一个 Java write() 甚至有可能变成多个 write 系统调用!

          简单的答案是尝试更改流的缓冲。不幸的是,我认为 Java API 不允许您为控制台标准输出/错误流执行此操作。

          其他不完美的答案包括:

          • 更改您的应用程序以同步您对 System.out/err 对象的所有写入。不幸的是,这可能会掩盖您尝试测试的代码中的同步错误!

          • 将您的应用程序更改为输出到 ByteArrayOutputStream()。这将减少“中断”的变化,但它仍然可能偶尔发生,除非你同步。

          我能想到的最佳答案是创建一个包装器 Stream / Reader 类,该类将写入同步到 ByteArrayOutputStream,将所有消息写入一个实例,然后在测试时将批次转储到 System.out(或任何地方)完毕。这可能会掩盖同步错误,但与在 System.out/err 对象上进行同步相比,这种可能性要小得多。

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2017-01-28
            • 2015-02-16
            • 1970-01-01
            • 1970-01-01
            • 2011-01-28
            • 2017-05-18
            相关资源
            最近更新 更多