是什么启动了JVM线程?

时间:2010-11-02 12:47:44

标签: jvm java jconsole jvisualvm

(如果我错了,请纠正我)

据我所知,当您通过发出java命令运行java程序时,

java MyProg

程序将运行到新的JVM上。

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

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

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

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

谢谢

3 个答案:

答案 0 :(得分:6)

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

答案 1 :(得分:2)

有几种方法可以让不同的jvms中的程序进行通信:

  1. ObjectInputStream,ObjectOutputStream

  2. RMI

  3. 插座

答案 2 :(得分:2)

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