jshell 中 J 和 R 标志的确切含义/目的是什么?

What is the exact meaning / purpose of the J and R flags in jshell?

来自帮助信息:

-J<flag>              Pass <flag> directly to the runtime system.
                      Use one -J for each runtime flag or flag argument
-R<flag>              Pass <flag> to the remote runtime system.
                      Use one -R for each remote flag or flag argument

我无法在 tools documentation and jshell user guide 中找到解释。

另外,在jshell的上下文中,"the remote runtime system"是什么?

据我了解,JShell有3个主要'places'执行代码:

使用 jshell 工具,我们在启动前没有 current 进程,所以我们只有两个选择 - 使用一个 JVM(本地),或使用两个 JVM -一个用于 JShell 客户端(本地),另一个用于执行引擎(可能是远程)。

有趣的是,JShell 默认总是启动两个 JVM,因为硬编码的 --execution 键是 "failover:0(jdi:hostname(" + loopback + ")),1(jdi:launch(true)), 2(jdi)"(参见 JShell class源代码)。

言归正传。我用 -verbose 选项做了几个实验,并在运行时用 ManagementFactory.getRuntimeMXBean().getInputArguments().

检查了 JVM 选项
  • jshell -J-verbose 命令

    在控制台打印 -verbose 输出。

    输入参数中没有-verbose选项:[-agentlib:jdwp=transport=dt_socket,address=127.0.0.1:63305]

  • jshell -R-verbose命令

    控制台无-verbose输出。

    在输入参数中打印 -verbose 选项:[-agentlib:jdwp=transport=dt_socket,address=127.0.0.1:63339, -verbose]

  • jshell --execution="local" -J-verbose 命令

    在控制台打印 -verbose 输出。

    在输入参数中打印 -verbose 选项:[-Dapplication.home=C:\Program Files\Java\jdk-9, -Xms8m, -verbose, -Djdk.module.main=jdk.jshell]

  • jshell --execution="local" -R-verbose

    控制台无-verbose输出。

    输入参数中没有-verbose选项:[-Dapplication.home=C:\Program Files\Java\jdk-9, -Xms8m, -Djdk.module.main=jdk.jshell]

TL;DR

远程执行(默认情况下,通过 JDI 执行)

-J<flag> 将选项传递给 JShell 客户端 JVM

-R<flag> 将选项传递给 执行引擎 JVM

本地执行(--execution="local")

-J<flag> 将选项传递给 仅存在 JVM

-R<flag>什么都不做

我仍然找到解释两个属性中使用的标志的用法的范围,以便完全回答问题,因此在这里用文字表达。

-J 标志用于向 JShell 提供 运行时参数 ,这类似于通过 IDE 执行时提供的方式运行 -> 配置 将参数指定为 -Dkey=value.

该属性的用法已记录在案,与 just that the -J flags are instead the java command line options 中说明的用法非常相似。 例如,使用 -XX:+PrintCommandLineFlags 将详细说明当前 JVM 使用的运行时标志。

因此,您的 JShell 实例使用的命令行标志的默认值(不设置任何额外的标志)可以是:-

但是假设您不想在 JShell 执行中使用 Java9 的 CompactStrings 您可以使用 -J 标志和 [=19 告诉 JVM =] 属性,如 -

jshell -R-XX:+PrintCommandLineFlags -R-XX:-CompactStrings

将列出以下输出:

➜ 类似的java命令行options/flags,当附加并用于在远程JVM上启动JShell时,在远程执行期间链接到JShell的-R属性。

jshell -R-XX:+PrintCommandLineFlags -R-XX:-CompactStrings

Anatoly 的 对其进行了大量研究,我建议阅读该书以了解用于本地执行和远程执行的 JShell 的控制和执行引擎。