JVMTI代理如何在启动时设置JVM标志?

时间:2016-05-18 11:59:57

标签: java jvm jvmti

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

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

根据问题记录here如果标记不在,我们会得到一个有偏见的个人资料。最好不要警告用户并启用标志。

3 个答案:

答案 0 :(得分:10)

至于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上执行此操作有一个丑陋的黑客。

  1. 阅读/proc/self/maps以查找libjvm.so
  2. 的基地址
  3. 使用ELF format reader发现动态库中所需符号的偏移量。
  4. 直接写入此符号的地址。
  5. 这个技巧是a sample code

答案 1 :(得分:1)

好的,这不是一个确切的答案,而是在某个方向上的推动......

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

答案 2 :(得分:1)

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

(有关列表,请参阅http://hg.openjdk.java.net/jdk7/jdk7/hotspot/file/b92c45f2bc75/src/share/vm/runtime/globals.hpp并搜索manageable)。

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