【发布时间】:2015-12-19 11:44:08
【问题描述】:
我正在开发 JVMTI 代理,我想在方法进入和退出时识别相同的线程。我可以获取线程名称,但这还不够。
想象一下你有这样一个方法:
public class Main {
public static void myMethod() {
System.out.println("doing something as " + Thread.currentThread().getName());
Thread.currentThread().setName("SomethingDifferent");
System.out.println("doing something as same thread " + Thread.currentThread().getName());
}
}
所以进入这个方法会有一个名字,退出这个线程会有不同的名字。
当像这样使用 JVMTI 时:
static void JNICALL callback_on_method_entry(jvmtiEnv *jvmti, JNIEnv* env,
jthread thread, jmethodID method)
{
...
(*jvmti)->GetThreadInfo(jvmti, thread, &info);
...
}
static void JNICALL callback_on_method_exit(jvmtiEnv *jvmti, JNIEnv *env, jthread thread, jmethodID method, jboolean was_popped_by_exception, jvalue return_value)
{
...
(*jvmti)->GetThreadInfo(jvmti, thread, &info);
...
}
每个info 都会报告不同的线程名称,我希望它们具有相同的标识符。
如何获得相同的线程标识符?
一种解决方案是获取引用的Thread (tid) 的字段值。
怎么做 ?我可以遍历堆,但无法获取字段名称。
【问题讨论】:
-
...是否有问题隐藏在某个地方,或者您只是想分享您的经验??
-
你得看标题。但可以肯定的是,我在文章中添加了问题。
-
这不是问题,而是陈述。另外:在您的内容中完全排除您的实际问题可以保证您得到完全零答案。这不是某种博客或论坛,人们想提供帮助,但如果你连一个简单的问题都无法提出来,他们也拒绝这样做......大多数时候
标签: java multithreading agent jvmti