JVM设置的对象标签是否对JVMTI代理可见?

时间:2016-05-25 14:04:46

标签: tags jvmti

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

  • 使用SetTag
  • 标记访问过的每个对象
  • 过滤掉标记的对象,例如通过在堆过滤标志中设置 QAccelerometer *accmeter = new QAccelerometer(); accmeter->start(); QAccelerometerReading *reading = new QAccelerometerReading(); qreal x = reading->x(); qreal y = reading->y(); qreal z = reading->z(); QMessageBox *box = new QMessageBox(); box->setText("x="+ QString::number(x)+ "\n" "y="+ QString::number(y)+ "\n" "z="+ QString::number(z)+ "\n"); box->exec();

然而,选择合适的标签值存在问题。对象标记的documentation表示:

  

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

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

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

1 个答案:

答案 0 :(得分:1)

读取jvmtiTagMap.cpp中的热点代码,并观察到相应的header file仅包含在JVMTI代码中,垃圾收集器似乎很可能不使用标记映射进行自己的标记。 / p>

因此问题的答案几乎可以肯定,JVM本身设置的标签在JVMTI环境中可见。