3

如果我有 3 个任务要同时运行所有这些任务,那么我现在正在考虑两种方法。

由于我在 linux 中运行程序,我可以在 shell 脚本中执行它。

  java Task1 &
  java Task2 &
  java Task3 &

或者,我可以使用一个 java 程序来生成三个子线程来完成任务。

我想知道哪种方式更有效。我怀疑shell方式会创建多个JVM实例吗?

4

5 回答 5

4

在 Java 中执行此操作会更有效,使您的程序多线程并使用三个线程。是的,shell 方式会创建三个 JVM 实例。

但问题是,你为什么要考虑一种选择而不是另一种呢?如果这只是一个小任务,我个人会像你一样在 shell 中启动三个实例。

于 2012-10-07T21:43:38.997 回答
2

如果任务运行时间长,三个JVM的开销可以忽略不计:

  • 由于文件系统缓存,加载时间/磁盘访问没有问题。
  • 共享库内存在 Linux 内核中是单例的。我假设 Java 使用每个线程的垃圾收集器,与三个 JVM 相比,分配给三个线程的默认内存量相同(最小的 JVM 元数据内存除外)。
  • 众所周知,Linux 在进程调度方面非常高效,使守护进程的独立分支至少与多线程一样高效。在 Windows 下,我们有不同的情况,其中进程实例化是一项昂贵的操作。

很长一段时间,我指的是每个任务 30 秒。那么短期任务呢?在这里,只有经常重复任务时,时间效率才重要。重复运行(重新)加载 JVM 的开销要小得多,但总有一些会留下来。

结论:使用 shell 脚本更容易实现,编写和维护的代码更少,可配置性更高,无需编写更多代码。在运行时,在一个常见的场景中,您将观察到两种方法之间没有太大的区别。

于 2012-10-07T22:10:01.793 回答
0

您现在的做法是启动三个单独的 JVM 实例,每个实例专用于一项任务。如果要在一个 JVM 上同时运行所有三个任务,则需要为它们创建 Thread 对象。

所以我会创建一个非常简单的 Java 程序,它会在自己的线程中启动这些任务。然后我会将该程序转换为 .jar 文件并安排它执行。

于 2012-10-07T21:45:17.177 回答
0

JVM越多,cpu时间越多。由于一个JVM上的三个线程会更好。但值得进行简单的基准测试。如果你这样做,请与我们分享。

于 2012-10-07T21:46:09.673 回答
0

我想知道哪种方式更有效。

如果您只是限制您决定处理器效率的标准,那么 Java 线程方法最有可能更高效。在 JVM 启动和内存利用率方面运行额外的 JVM 的开销将是可观的。

多线程版本可能较慢的唯一情况涉及任务之间对某些资源的竞争或 JVM 调优选项的错误选择;例如,如果你让堆太小。

但是,我认为纯粹根据处理器效率做出决定并不明智:

  • 如果任务长时间运行并且您有足够的内存用于 3 个 JVM,则性能差异(以百分比表示)可能微不足道。(如果整个运行需要 10 个小时,谁会在乎你是否需要多花 10 秒来启动 JVM!)

  • 您还需要考虑开发时间、测试和维护。您的想法需要考虑编写强大的多线程应用程序的潜在复杂性。(如果没有更多关于系统功能和非功能要求的详细信息,我无法预测。)

总之,如果没有您的问题的更多细节等,就没有好的明确答案


我怀疑shell方式会创建多个JVM实例吗?

错误的。它将创建多个JVM实例。

于 2012-10-08T00:26:04.840 回答