gpt4 book ai didi

java - 是否可以在运行时禁用 `-XX:+PrintCompilation` 和 `-verbose:gc"`?

转载 作者:行者123 更新时间:2023-12-03 11:17:14 26 4
gpt4 key购买 nike

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

  -XX:+PrintCompilation
-verbose:gc
这对于调试计时阶段发生的 JVM Activity 非常有用,但是当我只是计算统计信息并打印有关刚刚运行的基准测试的输出时,输出就没那么有用了。
有没有办法在运行时禁用这些标志中的一个或两个,以便我可以在计时阶段后关闭它们?

最佳答案

在运行时关闭 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 上实现这一点的示例。
  • 找到加载的JVM库的基地址:
  • $ grep libjvm.so /proc/<pid>/maps
    7f57435ca000-7f574470d000 r-xp 00000000 fd:00 2342674 /usr/java/jdk-11/lib/server/libjvm.so
    ^^^^^^^^^^^^
  • 找到 PrintCompilation 的偏移量符号在 libjvm.so :
  • $ nm /usr/java/jdk-11/lib/server/libjvm.so | grep PrintCompilation
    000000000144d7ff b PrintCompilation
    ^^^^^^^^^^^^^^^^
  • 现在写 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);

    关于java - 是否可以在运行时禁用 `-XX:+PrintCompilation` 和 `-verbose:gc"`?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/65909269/

    26 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com