8

从帮助信息:

-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

我在工具文档jshell 用户指南中都找不到解释。

另外,什么是 jshell 上下文中的“远程运行时系统”?

4

2 回答 2

11

据我了解,JShell 有 3 个主要的“地方”来执行代码:

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

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

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

  • 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;博士

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

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

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

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

-J<flag>将选项传递给唯一存在的JVM

-R<flag>什么也没做

于 2017-09-25T14:49:52.353 回答
3

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

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

该属性的用法已记录在案,并且与为标志-C说明的非常相似,只是 -J 标志是java命令行选项。例如,使用-XX:+PrintCommandLineFlags将详细说明当前 JVM 使用的运行时标志。

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

在此处输入图像描述

但是假设您不想CompactStrings在 JShell 执行中使用 Java9,您可以使用-J标志和-XX:-CompactStrings属性告诉 JVM 这样做,因为 -

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

将列出以下输出:

在此处输入图像描述

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

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

Anatoly 的答案附有大量研究,我建议阅读它以了解 JShell 的控制和执行引擎,用于本地与远程执行。

于 2017-10-14T10:38:01.820 回答