顺序执行java程序==顺序激活jvm?

时间:2009-06-24 14:07:12

标签: java jvm

我有一个按顺序调用java程序的bash脚本。这有点棘手但主要是我做的是有一个循环并执行大约1500次相同的java程序与不同的参数。

我的问题是,当使用java 1.5(sun VM)时,每次调用java程序时都会创建一个新的jvm实例? (我不确定这是正确的词汇......)

我是否应该通过引入一个间接级别来避免这种情况,即构建所有参数的列表,然后执行一个java程序,它接受这些参数并执行以前的入口点?

或者我可以通过将JVM配置为常驻或类似的东西来处理问题并动态调用我的程序....

希望这很清楚......

... THX

4 个答案:

答案 0 :(得分:4)

您可以将参数保存到文件中,并使用Java程序处理它而无需不断重启。您还可以通过控制台将参数传递到正在运行的Java应用程序中,类似于ls | grep java

编辑:并针对第一个问题。我怀疑java运行时会故意留在内存中。无论如何,大多数JRE文件可能仍会保留在磁盘缓存中。在Windows上有一个Java Quick Start服务,它保留JRE文件以减少java程序的启动时间。不知道* nix是否有类似的东西。

答案 1 :(得分:1)

显然事先拥有所有参数并在此之后运行程序将是最佳解决方案。如果由于任何原因你无法做到这一点我有一个非常脏的解决方案。让您的程序注册一个端口并听取它的输入。然后只需将参数传递给该端口,让程序将它们作为新实例处理。

答案 2 :(得分:1)

JVM启动速度非常慢,并且它当然不打算在这样的循环中完成。不幸的是,如果要将命令行参数传递给java程序,避免这种情况的唯一方法是以某种方式修改java程序本身以具有替代形式的交互(从控制台,端口或读取文件) 。如果无法更改java程序,Java Quick Start是唯一(最接近a)解决方案。

真正的解决方案是更改Java程序。最明显的变化是让你的循环写入文件,然后启动一次读取文件一行的java程序。如果循环不关心java程序对下一组参数的结果,那么这是有效的。

如果确实如此,那么真的有必要了解这种关系,以便就适当的解决方案提出建议。 Savvas建议的套接字解​​决方案肯定是一个通用解决方案,但可能有更好的选择,具体取决于您需要完成的任务。

答案 3 :(得分:0)

您可以使用答案中的启动器 Simultaneously run java programs run on same JVM?逐行读取输入并启动程序的main()方法。