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'执行代码:
在当前进程中(参见DirectExecutionControl)
在与 JShell 客户端相同的 JVM 中(参见 LocalExecutionControl)
在远程代理上(参见JdiDefaultExecutionControl)
使用 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 的控制和执行引擎。
来自帮助信息:
-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'执行代码:
在当前进程中(参见DirectExecutionControl)
在与 JShell 客户端相同的 JVM 中(参见 LocalExecutionControl)
在远程代理上(参见JdiDefaultExecutionControl)
使用 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()
.
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
.
该属性的用法已记录在案,与 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 的