Java java 与 jinfo 报告的选项 MaxDirectMemorySize 不同
Java option MaxDirectMemorySize reported differently by java vs. jinfo
我用新的内存选项 Java 重新启动了一个进程 -Xms4G -Xmx4G -XX:MaxDirectMemorySize=6G
并想验证这些更改是否正确应用,尤其是 6G 直接内存。
我找到的第一个验证解决方案是通过 java
本身,但这只是报告了一个 0
,暗示我的新设置没有效果:
bash-4.4$ java -XX:+PrintFlagsFinal -version | grep MaxDirect
uintx MaxDirectMemorySize = 0 {product}
openjdk version "1.8.0_242"
OpenJDK Runtime Environment (build 1.8.0_242-b08)
OpenJDK 64-Bit Server VM (build 25.242-b08, mixed mode)
我后来找到的第二个解决方案是通过 jinfo
,这显然证实了我打算设置的 6G
:
bash-4.4$ jinfo -flag MaxDirectMemorySize 1
-XX:MaxDirectMemorySize=6442450944
我之前曾将 java -XX:+PrintFlagsFinal
用于其他目的,但现在我想知道为什么它没有 return 预期值。为什么 java
和 jinfo
return 结果不同?
有(至少)两个不同的 JVM。
[扩展评论:] java {nothing} -XX:+PrintFlagsFinal -version
创建一个新的 JVM,更改 none 其默认配置,并打印生成的配置,这是没有更改的默认配置 -- 和MaxDirectMemSize 的默认值确实为零。
OTOH jinfo {option} pid
附加到 已经 运行ning JVM 并获取或更改该 JVM 的配置(尽管特定的 pid 1 不是'它通常不是 JVM,但它通常在您使用的 docker 容器中)。 jps
列出了您可以附加到的 运行ning JVM,以及包含 JVM 参数 and/or 应用程序参数的选项。
Does this imply that the same verification cannot be achieved with java
? Unlike jinfo
it cannot be attached to a running JVM?
是也不是;它有点仙境。
java
自己 创建一个新的 JVM,与任何现有的 JVM 分开。通常这个 JVM 运行 是一个 user-specified 程序,但是当你使用 -version
时,它只打印版本信息并在没有 运行 任何东西的情况下退出。
现在,attach API 可从 Java 访问(实际上部分写入)。 jinfo
更详细地做的是:
创建一个新的 JVM;这不使用 java
可执行文件,因此不容易看到,但它实际上是一个 JVM,就像 java
中的一样
使用那个 JVM 来 运行 一些预定义的 Java 代码,这些代码曾经在 JDK/lib/tools.jar 中;我没有费心在新的 post-8 调制 Java
中找到它的位置(以及如何访问它)
当 jinfo
JVM 中 运行 时的 Java 代码附加到指定的 other[=72 并访问其中的信息=] JVM,之前使用 java -Xvarious
创建并配置到 运行 您的应用程序
您实际上可以自己完成第 2 步和第 3 步;您可以编写 Java 代码,使用 API 附加到指定的(或以其他方式定位的)现有 JVM 并获取您想要的信息,然后使用 java
到 运行 JVM#2 您访问现有 JVM#1 中信息的代码。但是,当 jinfo
(和 jstat jmap jconsole
等)已经做了需要的事情时,为什么还要麻烦呢?
就此而言,jps
也这样做——它 运行 将自己的 JVM 连接到 运行 Java 'tool' 使用附加的代码API 列出 JVM。这就是为什么 jps
生成的列表包含 jps
本身,除非经过过滤。事实上,如果你可以 运行 jps
在非常短的时间内 jinfo
是 运行ning,那么 jps
列表也会包括 jinfo
- - 如果您可以在非常短的时间内 jps
确定 jps
和 运行 jinfo
的 pid jps
是 运行ning,您可以得到 jinfo
-关于jps
JVM 的类型信息。
够清楚了吧?
我用新的内存选项 Java 重新启动了一个进程 -Xms4G -Xmx4G -XX:MaxDirectMemorySize=6G
并想验证这些更改是否正确应用,尤其是 6G 直接内存。
我找到的第一个验证解决方案是通过 java
本身,但这只是报告了一个 0
,暗示我的新设置没有效果:
bash-4.4$ java -XX:+PrintFlagsFinal -version | grep MaxDirect
uintx MaxDirectMemorySize = 0 {product}
openjdk version "1.8.0_242"
OpenJDK Runtime Environment (build 1.8.0_242-b08)
OpenJDK 64-Bit Server VM (build 25.242-b08, mixed mode)
我后来找到的第二个解决方案是通过 jinfo
,这显然证实了我打算设置的 6G
:
bash-4.4$ jinfo -flag MaxDirectMemorySize 1
-XX:MaxDirectMemorySize=6442450944
我之前曾将 java -XX:+PrintFlagsFinal
用于其他目的,但现在我想知道为什么它没有 return 预期值。为什么 java
和 jinfo
return 结果不同?
有(至少)两个不同的 JVM。
[扩展评论:] java {nothing} -XX:+PrintFlagsFinal -version
创建一个新的 JVM,更改 none 其默认配置,并打印生成的配置,这是没有更改的默认配置 -- 和MaxDirectMemSize 的默认值确实为零。
OTOH jinfo {option} pid
附加到 已经 运行ning JVM 并获取或更改该 JVM 的配置(尽管特定的 pid 1 不是'它通常不是 JVM,但它通常在您使用的 docker 容器中)。 jps
列出了您可以附加到的 运行ning JVM,以及包含 JVM 参数 and/or 应用程序参数的选项。
Does this imply that the same verification cannot be achieved with
java
? Unlikejinfo
it cannot be attached to a running JVM?
是也不是;它有点仙境。
java
自己 创建一个新的 JVM,与任何现有的 JVM 分开。通常这个 JVM 运行 是一个 user-specified 程序,但是当你使用 -version
时,它只打印版本信息并在没有 运行 任何东西的情况下退出。
现在,attach API 可从 Java 访问(实际上部分写入)。 jinfo
更详细地做的是:
创建一个新的 JVM;这不使用
中的一样java
可执行文件,因此不容易看到,但它实际上是一个 JVM,就像java
使用那个 JVM 来 运行 一些预定义的 Java 代码,这些代码曾经在 JDK/lib/tools.jar 中;我没有费心在新的 post-8 调制 Java
中找到它的位置(以及如何访问它)当
jinfo
JVM 中 运行 时的 Java 代码附加到指定的 other[=72 并访问其中的信息=] JVM,之前使用java -Xvarious
创建并配置到 运行 您的应用程序
您实际上可以自己完成第 2 步和第 3 步;您可以编写 Java 代码,使用 API 附加到指定的(或以其他方式定位的)现有 JVM 并获取您想要的信息,然后使用 java
到 运行 JVM#2 您访问现有 JVM#1 中信息的代码。但是,当 jinfo
(和 jstat jmap jconsole
等)已经做了需要的事情时,为什么还要麻烦呢?
就此而言,jps
也这样做——它 运行 将自己的 JVM 连接到 运行 Java 'tool' 使用附加的代码API 列出 JVM。这就是为什么 jps
生成的列表包含 jps
本身,除非经过过滤。事实上,如果你可以 运行 jps
在非常短的时间内 jinfo
是 运行ning,那么 jps
列表也会包括 jinfo
- - 如果您可以在非常短的时间内 jps
确定 jps
和 运行 jinfo
的 pid jps
是 运行ning,您可以得到 jinfo
-关于jps
JVM 的类型信息。
够清楚了吧?