3

(如果我错了请纠正我)

我了解当您通过发出 java 命令运行 java 程序时,

java MyProg

该程序将在新的 JVM 上运行。

  • 什么将程序加载到新的 JVM 中?是产生新线程的JRE吗?

  • 如果每个程序都运行在自己的 JVM 中,它们是否可以相互通信?

  • 我之前问过一个关于如何使用 JMX 向本地运行的 java 程序发送请求的问题。我发现如果 JMX 命令是在本地发出的,我不需要端口号。答案是客户端应用程序(例如 jconsole、jvisualvm、jprobe 等)搜索机器上运行的 java 应用程序。这很好,但考虑到客户端应用程序将在与其想要监视或与之通信的应用程序不同的 JVM 中运行,它们如何在没有端口号的情况下相互连接(因为它们没有在同一个 JVM 上运行)?

  • 如果两个程序正在运行,通常会有 2 个 JVM。JVM 是否在同一个 JRE 进程中运行?而且这是否意味着两个 JVM 应该能够通信?

谢谢

4

3 回答 3

6
  • 程序(更具体地说是编译的类)由 JVM 中的一个称为 System Class Loader 的组件加载。(在此处阅读有关类加载器的更多信息)。JVM 使用本机代码库(由引导类加载器加载)生成一个新线程。
  • 它们可以使用套接字、RPC 和其他 IPC 机制(通常使用本机库访问)进行通信。
  • 不知道确切的答案,但必须有一个标准端口。
  • JVM 的不同实例是不同的进程。它们在内存中不共享任何内容。(不过,如果在同一系统上运行,它们可能会共享同一 JRE 安装的库和配置文件。这与在同一系统上运行 Firefox、Emacs 或其他一些应用程序的两个实例没有什么不同)。
于 2010-11-02T12:59:39.063 回答
2

不同jvm中的程序有几种通信方式:

  1. 对象输入流、对象输出流

  2. RMI

  3. 插座

于 2010-11-02T12:59:29.960 回答
2

幕后没有什么特别的魔法。java是一个实现JVM的程序。如果你同时运行java两个不同的程序(比如说在两个不同的 shell 中),你会得到两个运行它们自己的 JVM 的进程。它们可以通过您喜欢的任何 IPC 或网络协议进行通信。

于 2010-11-02T13:01:13.340 回答