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

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

要运行程序,我们就是这样做的

java ProgramName 

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

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

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

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

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

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

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

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

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

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

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

同样来自java -我们可以阅读Java应用程序启动器

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

所以java为JVM创建了一个进程,它将加载一个类并调用它的main方法。

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