2010-10-11 158 views
4

我想从我自己的Java应用程序执行一个jar。 (不可能将这个jar导入到一个库中,然后启动该应用程序作为我自己的“启动器”的一个实例)。从我自己的Java应用程序执行jar ...我使用的是下一行:“Runtime.getRuntime()。exec()”的性能不佳吗?

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

这完美的作品。我没有抱怨这件事。

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

回答

3

表现本质上是一样的,因为在这两种情况下基本上都是相同的事情。例如,在UNIX/Linux平台上:

  • 当前进程为'分叉'。
  • 新的子进程'exec''java'命令,传递指定的命令行参数。
  • 孩子JVM启动...

有可能是继发的性能差异。例如,以孩子的标准输入/输出/错误流得到父母处理的方式可能会有所不同。但通常你可以忘记这种事情。

[作为@Amadan音符,用一个类加载器来启动在目前的JVM的Java应用程序是有效的多...因为它避免了JVM启动,公共代码的JIT编译等,但主要的开销缺点(除简单性外)是没有有效的方法让“父”应用程序控制在同一个JVM中运行的“子”应用程序。如果孩子被困在一个循环中,或者资源管理通常是sl,不乐,父母也会受到影响。]

1

这是相同。

执行一个进程正在执行一个进程,无论命令处理器执行了它还是您的应用程序。

+1

你能给我一个简短的解释或参考吗?谢谢! – testk 2010-10-12 00:00:41

+1

我确认,这是*相同*。效率较低,但比通过'ClassLoader'更容易。 – Amadan 2010-10-12 00:07:55

1

通过这种方式它是相同的。使用新的api ProcessBuilder,它有更好的方式来指定参数..

相关问题