Java 是不是;Runtime.getRuntime().exec();表演不好吗?

Java 是不是;Runtime.getRuntime().exec();表演不好吗?,java,performance,jar,runtime.exec,Java,Performance,Jar,Runtime.exec,我想从我自己的java应用程序中执行一个jar。(不可能将该jar导入库并作为我自己的“启动器”实例启动应用程序)。要从我自己的java应用程序执行jar,我将使用以下几行: String [] cmd = new String [] {"java","-jar","myjar.jar"}; Process process = Runtime.getRuntime().exec(cmd, null, null); 这非常有效。我对此没有任何抱怨 我的问题是:这是否与在命令行中通过“java-j

我想从我自己的java应用程序中执行一个jar。(不可能将该jar导入库并作为我自己的“启动器”实例启动应用程序)。要从我自己的java应用程序执行jar,我将使用以下几行:

String [] cmd = new String [] {"java","-jar","myjar.jar"};
Process process = Runtime.getRuntime().exec(cmd, null, null);
这非常有效。我对此没有任何抱怨

我的问题是:这是否与在命令行中通过“java-jar myjar.jar”执行该jar具有相同的性能?还是更糟??如果情况更糟……我可以用同样的性能来做这件事吗?

是一样的


执行一个进程就是执行一个进程,不管是命令处理器还是应用程序执行它。

性能基本相同,因为在这两种情况下发生的事情基本相同。例如,在UNIX/Linux平台上:

  • 当前进程是“分叉的”
  • 新的子进程“exec”调用“java”命令,传递指定的命令行参数
  • 子JVM启动
可能存在次要的性能差异。例如,父级处理子级标准输入/输出/错误流的方式可能不同。但通常你可以忘记这类事情


[正如@Amadan所指出的,使用类加载器在当前JVM中启动Java应用程序的效率要高得多……因为它避免了JVM启动、JIT编译公共代码等的开销。但主要的缺点(除了简单性)是“父”应用程序无法有效地控制“子”应用程序在同一JVM中运行的应用程序。如果子应用程序陷入循环中或在资源管理方面通常马虎,则父应用程序也会受到影响。]

无论如何,它都是一样的。使用新的api ProcessBuilder,它有更好的指定参数的方法。

您能给我一个简单的解释或参考吗?谢谢我确认,是一样的。这比使用
类加载器
效率低,但要简单得多。这里要添加的一点是,至少在类unix系统上,进程的fork()在将执行命令加载到内存之前复制整个进程。当在HelloWorld中使用时,这不会增加很多成本,但是如果是从.war或.ear文件中的应用服务器上下文中执行的(其中应用服务器的进程大小通常至少为数百兆字节,甚至数千兆字节),这将是一个严重的性能问题