JVMTI代理通常需要遍历Java堆并精确访问每个活动对象一次。一种方法是调用FollowReferences并避免多次遍历给定对象:
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本身设置的标签可见,则代理需要避免与任何此类标记冲突,例如通过首先清除所有标签或以某种方式选择尚未使用的标签。
答案 0 :(得分:1)
读取jvmtiTagMap.cpp中的热点代码,并观察到相应的header file仅包含在JVMTI代码中,垃圾收集器似乎很可能不使用标记映射进行自己的标记。 / p>
因此问题的答案几乎可以肯定,JVM本身设置的标签在JVMTI环境中不可见。