同时在同一个JVM上运行Java程序?

26

假设我在同一台机器上同时运行两个Java程序,那么这些程序会在一个JVM实例中运行还是在两个不同的JVM实例中运行?

答案:这两个Java程序将在两个不同的JVM实例中运行。每个Java程序都需要它自己的JVM实例来执行,因为JVM提供了应用程序与底层操作系统之间的接口,以及内存管理和垃圾回收等重要功能。

1
它们可以共享dll,甚至编译后的类(取决于实现和配置)。 - Tom Hawtin - tackline
6个回答

24
如果您使用命令行以java命令开始每个程序,它们将作为完全独立的JVMs运行。
"程序"可以作为单独的线程在一个JVM内运行。

这是供应商相关的,但对于 Windows/Linux/OS x 标准的 Oracle JVM 是正确的。 - Thorbjørn Ravn Andersen

14

java只能一次打开一个应用程序,但是您可以编写一个简单的启动器,将类名作为参数并在单独的线程中执行它们。一个快速的概述:

public class Launcher {
  public static void main(String[] args) throws Exception {
    for (int i = 0; i<args.length; i++) {
      final Class clazz = Class.forName(args[i]);
      new Thread(new Runnable() {
        @Override
        public void run() {
           try{
             Method main = clazz.getMethod("main", String[].class);
             main.invoke(null, new Object[]{});
           } catch(Exception e) {
             // improper exception handling - just to keep it simple
           }
        }
      }).start();
    }
  }
}

调用方式:

  java -cp <classpath for all applications!> Launcher com.example.App1 com.example.App2

应该在同一个虚拟机中并行执行应用程序App1和App2。


1

这取决于平台和JVM实现,但通常它们会在单独的虚拟机中运行。


1

假设您所说的程序是指进程,那么是的,启动两个进程将创建两个不同的JVM。

JVM进程是使用Java应用程序启动器启动的;这应该提供了一个入口点到您的程序,即主方法。您可以从此入口点链接到其他类,也可以从其他类链接。除非您启动另一个进程(以运行另一个程序),否则这将在同一个JVM进程中继续发生。


0
程序会在单个JVM实例中运行还是在两个不同的JVM实例中运行?
这取决于您。最简单的方法是使用单独的JVM。

0
你可以使用两个单独的线程。例如:
new Thread() {
  public void run() {
   System.out.println("this is running separately from the main thread!");
  }
}.start();

如果您想让两个独立的程序进行交互,您需要使用套接字。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接