JVM 是否可以同时运行多个程序?如果是这样,怎么做?如果不是,为什么?
要运行程序,我们只需执行
java ProgramName
但是我们可以使用同一个 JVM 实例来运行另一个程序吗?
答案取决于您对“程序”的定义。main
具有方法的 Java 程序java NameOfClass
通常不能在同一个 JVM 中运行,因为没有内置的资源或名称空间分离。例如,如果两个程序使用相同库的冲突版本怎么办?
我们还有一些旨在共享 JVM 的应用程序,例如企业应用程序。这些程序旨在在“应用程序服务器”的上下文中运行,该程序基本上是用于运行其他程序的程序。应用程序服务器使用类加载器和安全管理器将应用程序资源分开。例如,由于通过不同的类加载器加载,两个应用程序可能使用冲突的库版本或冲突的类名,但仍然共享一个 JVM。
不是直接的。但是,由于 JVM 确实支持线程,因此您可以通过创建一个包装器将两个程序粘贴在一起,该包装器在不同的线程中启动每个程序(假设它们是兼容的并且不做诸如定义具有相同名称的不同类之类的事情)。
如果您根本不希望程序能够相互干扰或共享任何状态,那么即使在同一进程中运行它们又有什么意义呢?如果您只想通过只加载标准库一次来节省内存,您可以设置SecurityManagers
并ClassLoaders
隔离这两个程序。但是,这必然会阻止他们通过反射做疯狂的事情。
如果您从命令提示符执行 JAVA 命令,它将始终在单独的 JVM 实例上运行。如果您想使用相同的 JVM,可以为程序使用单独的线程。但是对于 JAVA 命令,它将是两个独立的进程,因此是独立的 JVM。
IBM 正在开发“多租户”JVM http://www.ibm.com/developerworks/library/j-multitenant-java/,这将使在同一虚拟机中运行多个 Java 程序成为可能/更容易。
一方面,你不能。JVM 只运行一个程序。另一方面,启动程序可以简单地按顺序或并行运行另一个程序。顺序方式特别简单:
ClassName1.main(new String[]{arg1, arg2});
ClassName2.main(new String[]{arg1, arg2, arg3});
要运行java
命令,您需要使用
java [ options ] class [ argument ... ]
java [ options ] -jar file.jar [ argument ... ]
同样来自-我们可以阅读java
的 Java 应用程序启动器
java工具启动 Java 应用程序。它通过启动 Java 运行时环境、加载指定的类并调用该类的main方法来做到这一点。
因此java
,为 JVM 创建进程,该进程将加载一个类并调用其main方法。
我没有看到任何选项可以添加其他类以通过java
命令执行其主要方法。如果您愿意,您可以在程序中启动新的线程/进程,但这不会改变 JVM 在启动时只运行一个main方法的事实。