“Runtime.getRuntime().exec()”性能差吗?

4

我希望能够从自己的Java应用程序中执行一个jar文件。(由于无法将该jar文件导入为库并将该应用程序作为我的自有“启动器”的实例启动),因此需要执行以下步骤:

我使用以下代码行来执行jar文件:

String [] cmd = new String [] {"java","-jar","myjar.jar"};
Process process = Runtime.getRuntime().exec(cmd, null, null);

这个完美地工作了。我对此没有任何抱怨。

我的问题是:这是否与在命令行中执行“java -jar myjar.jar”执行该jar具有相同的性能?还是更差?如果更差...有什么建议可以使其具有相同的性能?

3个回答

3
性能本质上是相同的,因为在两种情况下实际上发生了相同的事情。例如,在UNIX/Linux平台上:
  • 当前进程被“分叉”。
  • 新的子进程“exec”java命令,并传递指定的命令行参数。
  • 子JVM启动...
可能存在次要的性能差异。例如,处理父进程中的子进程标准输入/输出/错误流的方式可能不同。但通常您可以忽略这种事情。
[正如@Amadan所指出的,使用类加载器在当前JVM中启动Java应用程序更加高效...因为它避免了JVM启动、常见代码的JIT编译等开销。但主要缺点(除了简单性)是没有有效的方法来控制在同一JVM中运行的“子”应用程序的“父”应用程序。如果子进程陷入循环或资源管理不当,则父进程也会受到影响。]

这里需要补充的一点是,在类Unix系统中,进程的fork()在将命令加载到内存之前会复制整个进程。如果在.war或.ear文件的应用服务器上下文中执行此操作(其中应用服务器通常至少有数百甚至数千兆字节的进程大小),则会导致严重的性能问题,而在HelloWorld中使用则不会增加太多成本。 - Chris

1

它是一样的。

执行进程就是执行进程,无论是命令处理器还是您的应用程序执行。


1
你能给我一个简要的解释或参考资料吗?谢谢! - testk
1
我确认,这是相同的内容。虽然比经过“ClassLoader”更不高效,但更加容易。 - Amadan

1

从本质上讲,它是相同的。使用新的API ProcessBuilder,它有更好的指定参数的方式。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接