【发布时间】:2016-05-25 14:04:46
【问题描述】:
JVMTI 代理通常需要遍历 Java 堆并准确地访问每个活动对象一次。一种技术是调用FollowReferences 并避免多次遍历给定对象:
- 使用SetTag标记访问过的每个对象,并且
- 过滤掉标记的对象,例如通过在堆过滤器标志中设置
JVMTI_HEAP_FILTER_TAGGED。
但是,选择合适的标签值存在问题。对象标签的documentation 声明:
标签在环境中是本地的;也就是说,一个环境的标签在另一个环境中是不可见的。
由于每个 JVMTI 代理都有自己的环境,这可以防止一个代理与另一个代理设置的标签发生冲突。但是,文档似乎没有说明 JVM 本身设置的标签,例如在垃圾收集期间,在 JVMTI 环境中可见。它们是否可见?
如果 JVM 本身设置的标签 可见,则代理需要避免与任何此类标签发生冲突,例如通过首先清除所有标签或以某种方式选择尚未使用的标签。
【问题讨论】:
-
您可能想解释一下为什么Heap iteration functions 不适合。其中一些是否只访问每个对象一次?
-
这些实际上并没有更好,我不想分散主要问题的注意力。基本上有两组功能。那些遵循引用,因此可用于查找活动对象的对象,都具有与
FollowReferences相似的行为并面临标记问题。其他人找到活的和死的物体,这不是我们想要的。