【问题标题】:Are object tags set by the JVM visible to JVMTI agents?JVMTI 代理是否可以看到 JVM 设置的对象标签?
【发布时间】:2016-05-25 14:04:46
【问题描述】:

JVMTI 代理通常需要遍历 Java 堆并准确地访问每个活动对象一次。一种技术是调用FollowReferences 并避免多次遍历给定对象:

  • 使用SetTag标记访问过的每个对象,并且
  • 过滤掉标记的对象,例如通过在堆过滤器标志中设置JVMTI_HEAP_FILTER_TAGGED

但是,选择合适的标签值存在问题。对象标签的documentation 声明:

标签在环境中是本地的;也就是说,一个环境的标签在另一个环境中是不可见的。

由于每个 JVMTI 代理都有自己的环境,这可以防止一个代理与另一个代理设置的标签发生冲突。但是,文档似乎没有说明 JVM 本身设置的标签,例如在垃圾收集期间,在 JVMTI 环境中可见。它们是否可见?

如果 JVM 本身设置的标签 可见,则代理需要避免与任何此类标签发生冲突,例如通过首先清除所有标签或以某种方式选择尚未使用的标签。

【问题讨论】:

  • 您可能想解释一下为什么Heap iteration functions 不适合。其中一些是否只访问每个对象一次?
  • 这些实际上并没有更好,我不想分散主要问题的注意力。基本上有两组功能。那些遵循引用,因此可用于查找活动对象的对象,都具有与FollowReferences 相似的行为并面临标记问题。其他人找到活的和死的物体,这不是我们想要的。

标签: tags jvmti


【解决方案1】:

阅读jvmtiTagMap.cpp中的Hotspot代码并观察到对应的header file只包含在JVMTI代码中,垃圾收集器似乎很可能没有使用标签映射来进行自己的标记。

所以这个问题的答案几乎可以肯定是 JVM 本身设置的标签在 JVMTI 环境中是可见的。

【讨论】:

    猜你喜欢
    • 2016-09-14
    • 2019-07-03
    • 2021-08-24
    • 2017-09-19
    • 2011-03-03
    • 2012-03-11
    • 1970-01-01
    • 2011-05-06
    相关资源
    最近更新 更多