JVM是否可以同时运行多个程序?
JVM是否可以同时运行多个程序? 如果是这样,怎么样? 如果没有,为什么?
要运行程序,我们就是这样做的
java ProgramName
但是我们可以使用相同的JVM实例来运行另一个程序吗?
答案取决于你对“程序”的定义。 具有main
方法并且以java NameOfClass
开头的java NameOfClass
通常不能在同一JVM中运行,因为没有内置的资源或命名空间分离。 例如,如果两个程序使用同一个库的冲突版本怎么办?
我们还有用于共享JVM的应用程序,例如企业应用程序。 这些程序设计为在“应用程序服务器”的上下文中运行,“应用程序服务器”基本上是用于运行其他程序的程序。 应用程序服务器使用类加载器和安全管理器将应用程序资源分开。 例如,两个应用程序可能使用库的冲突版本或冲突的类名,并且仍然可以共享JVM,这要归功于通过不同的类加载器加载。
不是直接的。 但是,由于JVM确实支持线程,您可以通过创建一个包装器将两个程序粘贴在一起,这个包装器在不同的线程中启动每个程序(假设它们兼容并且不执行定义具有相同名称的不同类的内容)。
如果您不希望程序完全相互干扰或共享任何状态,那么甚至在同一个进程中运行它们有什么意义呢? 如果您只需要加载标准库一次就可以节省内存,则可以设置SecurityManagers
和ClassLoaders
来隔离这两个程序。 然而,这必然会阻止他们用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在启动时只运行一个主要方法的事实。