java - jvmti中如何唯一标识线程

标签 java multithreading agent jvmti

我正在处理 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) 的字段值。 怎么做 ?我可以遍历堆,但无法获取字段名称。

最佳答案

正如您所指出的,一种解决方案是使用 GetFieldName。这需要您查找 jfieldid,这真的很烦人。

我见过其他人这样做的方式是简单地分配他们自己的 ID 并将其存储在线程本地存储中。参见 JavaThreadLayer.cpp来自 UofO 的 TAU 项目,特别是 JavaThreadLayer::GetThreadId() 函数。

关于java - jvmti中如何唯一标识线程,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32717851/

相关文章:

java - 平滑地改变JavaFX效果

java - 获取任意java方法的委托(delegate)函数

java - Hibernate Criteria API 多重连接

Azure Release Pipeline - 如何设置代理池

java - 使用 Byte Buddy 的检测问题

Java 蜗牛线布局管理器

java - 为什么 ShutdownHookThread 'setDaemon true'

linux - fclose 在 Linux 上克隆线程后挂起

c# - 如何在 C# 中使用 TPL 任务将工作编码到主线程上而不导致死锁?

artificial-intelligence - 有没有办法在 Jason 中使用相同的源文件实例化多个代理?