【问题标题】:How can JVMTI agent set a JVM flag on startup?JVMTI 代理如何在启动时设置 JVM 标志?
【发布时间】:2016-09-14 21:38:34
【问题描述】:

为了支持更好的分析数据,我希望我的 JVMTI 代理启用几个 JVM 标志。 有问题的代理是Honest-Profiler,它只能在启动时加载。

我想启用标志:-XX:+UnlockDiagnosticVMOptions -XX:+DebugNonSafepoints

根据记录的问题here,如果未打开标志,我们会得到一个有偏见的配置文件。最好不要警告用户而只启用该标志。

【问题讨论】:

  • 如果你找不到合法的解决方案,@apangin 有一个血腥的方法:github.com/odnoklassniki/one-elf/blob/master/test/one/jvm/… 它找到加载的 libjvm.so 的地址并从 .so 地址 + .symtab 常量偏移量计算标志地址(但是它并不总是有效,取决于 VM 代码中的具体标志使用情况)

标签: java jvm jvmti


【解决方案1】:

好的,这不是一个精确的答案,而是更多地向某个方向轻推......

services/writeableFlags.hpp 中有设置VM 标志的静态方法。成功将取决于这些标志是否实际上是可变的,但这将是开始探索的好地方。我没有尝试从 JVMTI 代理调用这些方法,但理论上它应该可以工作。

【讨论】:

    【解决方案2】:

    有几个 JVM 标志可以在运行时使用 com.sun.management.HotSpotDiagnosticMXBean.setVMOption 编写。

    (列表见http://hg.openjdk.java.net/jdk7/jdk7/hotspot/file/b92c45f2bc75/src/share/vm/runtime/globals.hpp并搜索manageable)。

    不幸的是,对于您的用例,UnlockDiagnosticVMOptions 选项不可写。

    【讨论】:

      【解决方案3】:

      对于DebugNonSafepoints,你甚至不需要设置这个标志。看debugInfoRec.cpp

      static inline bool compute_recording_non_safepoints() {
        if (JvmtiExport::should_post_compiled_method_load()
            && FLAG_IS_DEFAULT(DebugNonSafepoints)) {
          // The default value of this flag is taken to be true,
          // if JVMTI is looking at nmethod codes.
          // We anticipate that JVMTI may wish to participate in profiling.
          return true;
        }
      
        // If the flag is set manually, use it, whether true or false.
        // Otherwise, if JVMTI is not in the picture, use the default setting.
        // (This is true in debug, just for the exercise, false in product mode.)
        return DebugNonSafepoints;
      }
      

      如果未设置该标志,则在启用 JVMTI CompiledMethodLoad 通知时仍会记录调试信息。您只需要请求can_generate_compiled_method_load_events 功能并打开JVMTI_EVENT_COMPILED_METHOD_LOAD 通知即可。

      这正是我在async-profiler 项目中的处理方式。


      没有安全的方法可以在运行时更改无法管理的 JVM 标志。但是,在 Linux 上执行此操作有一个丑陋的 hack。

      1. 读取/proc/self/maps,找到libjvm.so的基地址。
      2. 使用ELF format reader 发现动态库中所需符号的偏移量。
      3. 直接写入此符号的地址。

      这里是 a sample code 这个技巧。

      【讨论】:

      • 我已经通过 Helfy(以及 Hotspot SA)管理它。准备好后我会用示例代码展示它
      • @SerkanÖzal 酷!没想到 Helfy 可以用来做这件事。您介意将此示例添加到 github 上的 Helfy 存储库吗?
      • 当然@apangin,如果你愿意,我可以发送 PR :)
      • @SerkanÖzal 当然,继续创建 PR。谢谢!
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-09-12
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多