JVM是否可以同时运行多个程序?

时间:2013-04-25 17:05:33

标签: java jvm

JVM是否可以同时运行多个程序?如果是这样,怎么样?如果没有,为什么?

要运行程序,我们只需执行

java ProgramName

但是我们可以使用相同的JVM实例来运行另一个程序吗?

6 个答案:

答案 0 :(得分:11)

答案取决于你对“程序”的定义。具有main方法且以java NameOfClass开头的Java程序通常无法在同一JVM中运行,因为没有内置的资源或命名空间分离。例如,如果两个程序使用相同库的冲突版本会怎么样?

我们还有用于共享JVM的应用程序,例如企业应用程序。这些程序设计为在“应用程序服务器”的上下文中运行,“应用程序服务器”基本上是用于运行其他程序的程序。应用程序服务器使用类加载器和安全管理器将应用程序资源分开。例如,两个应用程序可能使用库的冲突版本或冲突的类名,并且仍然可以共享JVM,这要归功于通过不同的类加载器加载。

答案 1 :(得分:4)

不直接。但是,由于JVM确实支持线程,您可以通过创建一个包装器将两个程序粘贴在一起,这个包装器在不同的线程中启动每个程序(假设它们兼容并且不执行定义具有相同名称的不同类的操作)。

如果您不希望程序完全相互干扰或共享任何状态,那么即使在同一个进程中运行它们又有什么意义呢?如果您只想加载标准库一次就可以节省内存,则可以设置SecurityManagersClassLoaders来隔离这两个程序。然而,这必然会阻止他们用反射做出疯狂的事情。

答案 2 :(得分:2)

如果从命令提示符执行JAVA命令,它将始终在单独的JVM实例上运行。如果要使用相同的JVM,则可以为程序使用单独的线程。但是使用JAVA命令,它将是两个独立的进程,因此是单独的JVM。

答案 3 :(得分:1)

一方面,你不能。 JVM只运行一个程序。另一方面,启动程序可以简单地或者并行地运行另一个程序。顺序方式特别简单:

ClassName1.main(new String[]{arg1, arg2});
ClassName2.main(new String[]{arg1, arg2, arg3});

答案 4 :(得分:1)

IBM正在开发一个“多租户”JVM http://www.ibm.com/developerworks/library/j-multitenant-java/,这将使在同一个虚拟机中运行多个Java程序成为可能/更容易。

答案 5 :(得分:0)

要运行java命令,您需要使用

java [ options ] class [ argument ... ]
java [ options ] -jar file.jar [ argument ... ]

同样来自java - the Java application launcher我们可以阅读

  

java 工具启动Java应用程序。它通过启动Java运行时环境,加载指定的类并调用该类的 main 方法来实现此目的。

因此java为JVM创建进程,该进程将加载一个类并调用其 main 方法。

我没有看到通过java命令添加其他类来执行其主要方法的任何选项。如果你想要,你可以在程序中启动新的线程/ process,但它不会改变JVM在启动时只运行一个方法的事实。