2010-11-02 149 views
3

(请纠正我,如果我错了)什么启动JVM线程?

我明白,当你通过发出java命令运行Java程序,

java MyProg 

程序将运行到一个新的JVM。

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

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

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

  • 如果两个程序正在运行,通常会有2个JVM。 JVM是否在相同的JRE流程中运行?这也意味着这两个JVM应该能够沟通?

感谢

回答

6
  • 程序(更具体地编译的类)由一个组件在JVM称为系统类加载器加载。 (了解更多关于班级装载机的信息here)。 JVM使用本地代码库(由引导类加载器加载)生成一个新线程。
  • 它们可以使用套接字,RPC和其他IPC机制进行通信(通常使用本机库进行访问)。
  • 不知道确切的答案,但必须有一个标准的端口。
  • JVM的不同实例是独立的进程。它们在内存中不分享任何内容。 (尽管如果在同一个系统上运行,它们可能会共享相同JRE安装的库和配置文件,这与在同一系统上运行Firefox,Emacs或其他应用程序的两个实例没有区别。
+0

......必须有一个标准的端口或任何其他操作特定的IPC机制(例如Unix上的命名管道或shmem)。 – ShiDoiSi 2010-11-02 13:36:33

2

有几种方法用于方案不同的JVM进行通信:

  1. 的ObjectInputStream,ObjectOutputStream的

  2. RMI

  3. 插座

2

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