java - 同一类的两个对象实例在不同的 JVM 进程中运行
问题描述
我有一个简单的 Java SE 应用程序。它创建同一个类的两个实例,但每个实例都必须在单独的 JVM 进程中运行。怎样才能做到这一点?
解决方案
我有一个简单的 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.in
和System.out
内核级 I/O 通道是从一个 JVM 到一个 OS 内核的唯一实例。还要记住这一点,因为在多个 JVM 运行单个 Java 应用程序的情况下,这完全是一团糟和混乱。
推荐阅读
- angular - 如何从指令中访问某种类型的所有子组件?
- php - 删除一年中的月份
- java - Long 和 Double 比较 (==) 的行为不同
- python - 如何从没有numpy的多维数组中提取一行?
- javascript - 将 $_POST 变量传递给新 URL,然后返回到以前的 URL - 最佳实践?
- unit-testing - Kafka Streams 测试:java.util.NoSuchElementException:未初始化的主题:“output_topic_name”
- acumatica - 如何在屏幕和导入场景中避免 Acumatica 网格中的重复条目
- android - 如何对 LiveData 转换进行单元测试
- python-3.x - Python/Tkinter:ModuleNotFoundError:没有名为“_tkinter”的模块
- entity-framework - 为什么在我使用 entityframework 核心创建内存中的 sqlite 数据库时表不存在?