【问题标题】:Is it possible to disable `-XX:+PrintCompilation` and `-verbose:gc"` at runtime?是否可以在运行时禁用 `-XX:+PrintCompilation` 和 `-verbose:gc"`?
【发布时间】:2021-04-30 16:54:40
【问题描述】:

正如this answer 中所建议的,我在运行性能测试时使用了以下标志。

  -XX:+PrintCompilation
  -verbose:gc

这对于调试在计时阶段发生的 JVM 活动非常有用,但当我只是计算统计数据并打印有关刚刚运行的基准的输出时,输出就不太有用了。

有没有办法在运行时禁用这些标志中的一个或两个,以便我可以在计时阶段之后将它们关闭?

【问题讨论】:

  • 是的,有可能。您对哪个操作系统和 JDK 版本感兴趣?
  • @apangin 我在 Linux 和 OSX、JDK 11 上运行。

标签: java performance jvm performance-testing jvm-hotspot


【解决方案1】:

在运行时关闭 GC 日志很容易,因为 GC 日志包含在 Unified JVM Logging 框架中。

从命令行

jcmd <pid> VM.log what=gc=off

从应用程序内部

ManagementFactory.getPlatformMBeanServer().invoke(
        new ObjectName("com.sun.management:type=DiagnosticCommand"),
        "vmLog",
        new Object[]{new String[]{"what=gc=off"}},
        new String[]{"[Ljava.lang.String;"}
);

不幸的是,-XX:+PrintCompilation 不是一个可管理的标志,并且不遵守统一 JVM 日志记录。但是,也可以更改它。

我已经在this answer 中展示了如何使用可服务性代理在外部修改 JVM 标志。这是执行此操作的另一种方法。

想法是找到标志的内存地址并在内存中修改值。以下是如何在 Linux 上实现此目的的示例。

  1. 找到加载的JVM库的基地址:
$ grep libjvm.so /proc/<pid>/maps
7f57435ca000-7f574470d000 r-xp 00000000 fd:00 2342674    /usr/java/jdk-11/lib/server/libjvm.so
^^^^^^^^^^^^
  1. 找到PrintCompilation符号在libjvm.so中的偏移量:
$ nm /usr/java/jdk-11/lib/server/libjvm.so | grep PrintCompilation
000000000144d7ff b PrintCompilation
^^^^^^^^^^^^^^^^
  1. 现在将0写入地址base + offset的进程内存:
$ printf '\x00' | dd of=/proc/<pid>/mem bs=1 count=1 seek=$((0x7f57435ca000 + 0x144d7ff)) conv=notrunc

就是这样。 PrintCompilation 标志已关闭。

奖金

同样的技巧可以直接从 Java 应用程序中完成:像普通文件一样读取 /proc/pid/maps,解析 libjvm.so 的 ELF 格式以找到符号偏移量,最后使用 Unsafe 在给定的位置写入一个字节地址。 Here is the complete example.

更新

我添加了一个macOS example,用于在运行时从 Java 应用程序中修改 JVM 标志。用法很简单

VMFlags.setBooleanFlag("PrintCompilation", true);

【讨论】:

  • 谢谢! OSX 有等效的技巧吗?
  • 我想知道,当-XX:+PrintCompilation不能直接管理时,这是什么原因?以这里显示的方式更改它会不会不安全?
  • @merlin2011 是的。您想从外部还是从 Java 代码更改标志?
  • @akuzminykh 出于历史原因。我相信标志 can 在运行时是可管理的,只是以前没有人关心过。以这种方式更改标志是安全的,因为它就像常规的 bool 变量一样被查询,并且除了用于日志记录之外,对该标志没有隐式依赖。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2017-04-29
  • 1970-01-01
  • 1970-01-01
  • 2014-12-11
  • 1970-01-01
  • 2020-04-17
  • 2014-07-14
相关资源
最近更新 更多