首页 > 解决方案 > 同一类的两个对象实例在不同的 JVM 进程中运行

问题描述

我有一个简单的 Java SE 应用程序。它创建同一个类的两个实例,但每个实例都必须在单独的 JVM 进程中运行。怎样才能做到这一点?

标签: javajvm

解决方案


我有一个简单的 Java SE 应用程序,它创建了同一个类的两个实例,但每个实例都必须在不同的 JVM 进程中运行,如何实现呢?

TL;博士:

不能做到这一点,你应该想要这个,因为它根本没有意义。

胎儿不可能生活在两个不同母亲的子宫里。它必须属于任何一个。


稍微多一点:

当您运行 Java 程序时,对于每个单独的Java 应用程序(例如,手动打包.class的文件、.jar文件、J2EE 容器或任何其他 Java 应用程序),一个离散的 JVM 实例会在您的操作系统内核之上启动。

该 JVM 实例加载相应的字节码,初始化 Class Loader,分配内存和 CPU 时间,最后这就是您所看到的正在运行的 Java 应用程序

但是,如果您正在谈论进程间通信并将其与您在问题中提出的内容混淆,那么我必须告诉您,IPC 是两个(或更多)JVM 实例相互通信时的一种能力,而不是在几个 JVM 之间共享 Java 主类。

正如JLS §5.2 所说

Java 虚拟机通过使用引导类加载器(第 5.3.1 节)创建一个初始类来启动,该类以依赖于实现的方式指定。Java 虚拟机然后链接初始类,对其进行初始化,并调用公共类方法 void main(String[])。

因此,在引导 JVM 之后,在链接和初始化所有内容之后调用 main 方法。从理论上讲,您甚至不能在两个或更多 JVM 实例之间共享它。想想类加载器、垃圾收集、链接阶段......应该做什么?哪个应该引导主要?哪个应该维护Class对象实例化的类型实例?

此外,每个 JVM 实例都提供单个内核级输入输出流以与操作系统通信。

不知何故,您可以通过在一个 JVM 中运行多个 Java 应用程序来实现反之亦然,但这带来很多影响和问题,并且非常不鼓励这样做。

最后但并非最不重要的一点:您的System.inSystem.out内核级 I/O 通道是从一个 JVM 到一个 OS 内核的唯一实例。还要记住这一点,因为在多个 JVM 运行单个 Java 应用程序的情况下,这完全是一团糟和混乱。


推荐阅读