【问题标题】:Will triggering a java program from another program use same JVM or will it use a different JVM?从另一个程序触发 java 程序会使用相同的 JVM 还是会使用不同的 JVM?
【发布时间】:2019-01-27 09:11:51
【问题描述】:

下面的程序会使用 2 个不同的 JVM 吗?一个用于主程序,一个用于Sample.jar程序?

public class Hello {

    public static void main(String args[]) throws Exception {
        Thread.sleep(5000);
        System.out.println("will exec now");

        Process p = Runtime.getRuntime().exec("java -jar Sample.jar");
        while (p.isAlive()) {
            Thread.sleep(5000);
            System.out.println("still alive");
        }

        System.out.println("Done !!");
    }
}

【问题讨论】:

  • 那是启动一个不同的进程,一个单独的 JVM。
  • 附带说明,这段代码可能会导致死锁,因为Runtime.exec 在两个进程之间建立了管道,所以当子进程期望输入或产生的输出超过管道缓冲区可以存储时,它会永远挂着。如果您不想处理子流程的输入和输出,可以使用Process p = new ProcessBuilder("java", "-jar", "Sample.jar").inheritIO().start(); 将其重定向到父通道

标签: java jvm runtime exec


【解决方案1】:

一个用于主程序,一个用于 Sample.jar 程序?

是的,java 工具(*nix docsWindows docs)启动了一个新的 JVM 实例,与正在运行的实例完全无关¹,就像您直接运行它一样,而不是通过 Java 代码。

事实上,这两个 JVM 实例甚至可能是不同的版本,如果您在机器上安装了多个(例如 Java 9 和 Java 10)并且您正在其中一个(例如 Java 9)中运行此代码但是您调用的java 工具是另一个工具(比如Java 10)。但即使是同一个版本,这两个实例也完全不相关¹。


¹(除了一个是另一个的父进程)

【讨论】:

  • 谢谢!。有没有办法我可以在代码中打印 JVM 信息以区分它在不同的 JVM 中运行?
  • @user1 - 可以获取进程ID,两者会有所不同:stackoverflow.com/questions/35842/…
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2014-08-11
  • 1970-01-01
  • 1970-01-01
  • 2011-09-09
  • 2012-08-02
  • 2011-08-22
相关资源
最近更新 更多