JPDA 架构研究6 - Agent利用环境指针访问VM (线程管理篇)

简介:

引入:

上篇文章讲解了分类:内存管理,现在讲线程类操作的接口。


分类2:线程类操作

a.GetThreadState.获取线程状态

jvmtiError
GetThreadState(jvmtiEnv* env,
            jthread thread,
            jint* thread_state_ptr)

大家都知道线程有很多种状态,比如Alive,Terminated,Runnable, 等待进入Synchronize Block,Waiting,Sleeping,Parked,Suspended,Interrupted等。

它入参thread表示要查询的线程,返回thread_state_ptr表示线程状态。


b.GetAllThreads.获取所有活着的线程,这些线程必须是连接到当前VM并且Alive的。

jvmtiError
GetAllThreads(jvmtiEnv* env,
            jint* threads_count_ptr,
            jthread** threads_ptr)

它返回threads_count_ptr表示活着的线程数量,返回threads_ptr表示活着的线程的引用数组。


c.SuspendThread.挂起某线程

jvmtiError
SuspendThread(jvmtiEnv* env,
            jthread thread)

一旦挂起某线程,则对应方法无法返回直到另外有某个线程调用ResumeThread.

它入参thread表示要挂起的线程。


d.SuspendThreadList.挂起一组线程

jvmtiError
SuspendThreadList(jvmtiEnv* env,
            jint request_count,
            const jthread* request_list,
            jvmtiError* results)

一旦在ThreadList中某线程被挂起,则只有其他某线程调用ResumeThreadList或者ResumeThread后,此线程对应方法才可以返回。

入参request_count表示要挂起的线程数量,request_list,表示要挂起的线程数组,返回results表示挂起结果。


e.ResumeThread.恢复某个被挂起的线程

jvmtiError
ResumeThread(jvmtiEnv* env,
            jthread thread)


f.ResumeThreadList.恢复某个被挂起的线程组

jvmtiError
ResumeThreadList(jvmtiEnv* env,
            jint request_count,
            const jthread* request_list,
            jvmtiError* results)


g.StopThread.杀死某线程

jvmtiError
StopThread(jvmtiEnv* env,
            jthread thread,
            jobject exception)


h.InterruptThread.中断某线程

vmtiError
InterruptThread(jvmtiEnv* env,
            jthread thread)


i.GetThreadInfo.获取某线程信息

typedef struct {
    char* name;
    jint。 priority;
    jboolean is_daemon;
    jthreadGroup thread_group;
    jobject context_class_loader;
} jvmtiThreadInfo;
jvmtiError
GetThreadInfo(jvmtiEnv* env,
            jthread thread,
            jvmtiThreadInfo* info_ptr)

从这里可以看出,这里可以获取线程的名字,优先级,是否守护线程,所属线程组,上下文加载器等信息。


j.GetOwnerMonitorInfo.获取线程拥有的监视器(可以多个)信息

jvmtiError
GetOwnedMonitorInfo(jvmtiEnv* env,
            jthread thread,
            jint* owned_monitor_count_ptr,
            jobject** owned_monitors_ptr)

我在这里对Monitor的理解是线程持有的锁,也就是synchronized所关联的对象。

入参仍是给定线程,返回监视器的数量和监视器引用的数组。


k.GetCurrentContendedMonitor.获取线程当前的监视器。

jvmtiError
GetCurrentContendedMonitor(jvmtiEnv* env,
            jthread thread,
            jobject* monitor_ptr)

和上面配套使用。因为多个竞争者同时共享某线程,那么肯定有某个当前竞争者占用了此线程的执行。


l.SetThreadLocalStorage.VM设置一个thread-local的值来关联到某 环境-线程对。

jvmtiError
SetThreadLocalStorage(jvmtiEnv* env,
            jthread thread,
            const void* data)


m.GetThreadLocalStorage.Agent来获取为某线程设置的thread-local值。

jvmtiError
GetThreadLocalStorage(jvmtiEnv* env,
            jthread thread,
            void** data_ptr)




本文转自 charles_wang888 51CTO博客,原文链接:http://blog.51cto.com/supercharles888/1587694,如需转载请自行联系原作者
目录
相关文章
|
1月前
|
消息中间件 安全 Linux
线程同步与IPC:单进程多线程环境下的选择与权衡
线程同步与IPC:单进程多线程环境下的选择与权衡
82 0
|
1月前
|
缓存 安全 Java
为什么全局变量可能成为多线程环境中的安全隐患
为什么全局变量可能成为多线程环境中的安全隐患
|
1月前
|
消息中间件 SQL Kubernetes
实时计算 Flink版产品使用合集之多线程环境中,遇到 env.addSource 添加数据源后没有执行到 env.execut,是为什么
实时计算Flink版作为一种强大的流处理和批处理统一的计算框架,广泛应用于各种需要实时数据处理和分析的场景。实时计算Flink版通常结合SQL接口、DataStream API、以及与上下游数据源和存储系统的丰富连接器,提供了一套全面的解决方案,以应对各种实时计算需求。其低延迟、高吞吐、容错性强的特点,使其成为众多企业和组织实时数据处理首选的技术平台。以下是实时计算Flink版的一些典型使用合集。
|
1天前
|
人工智能 安全 人机交互
ACL 2024:PsySafe:跨学科视角下的Agent系统安全性研究
【6月更文挑战第21天】PsySafe是一个创新框架,关注多智能体系统集成大型语言模型后的安全风险。它从心理学角度评估和强化系统安全,通过模拟攻击检测漏洞,并设计防御策略。研究显示智能体的负面心理状态影响其行为安全,揭示了心理状态与行为模式的关联。该框架为MAS安全性研究提供新途径,但也面临智能体心理评估准确性和行为评估方法的挑战。[\[arxiv.org/pdf/2401.11880\]](https://arxiv.org/pdf/2401.11880)
14 6
|
18天前
|
Java Linux Shell
Linux环境下,让Jar项目多线程部署成为可能
Linux环境下,让Jar项目多线程部署成为可能
13 1
|
1月前
|
存储 编译器 C语言
【C++】类与对象【定义、访问限定符、this指针】
【C++】类与对象【定义、访问限定符、this指针】
10 1
|
1月前
|
运维 网络协议 Linux
2024年最全CentOS8 Consul微服务架构安装(1)_agent(1),Linux运维开发面试
2024年最全CentOS8 Consul微服务架构安装(1)_agent(1),Linux运维开发面试
|
1月前
|
人工智能 API 决策智能
【AI Agent系列】【MetaGPT多智能体学习】0. 环境准备 - 升级MetaGPT 0.7.2版本及遇到的坑
【AI Agent系列】【MetaGPT多智能体学习】0. 环境准备 - 升级MetaGPT 0.7.2版本及遇到的坑
56 0
|
1月前
|
存储 Java Python
【Python小知识】如何解决代理IP在多线程环境下的并发问题?
【Python小知识】如何解决代理IP在多线程环境下的并发问题?
|
1月前
|
消息中间件 Java 数据库连接
【C++ 多线程】C++ 多线程环境下的资源管理:深入理解与应用
【C++ 多线程】C++ 多线程环境下的资源管理:深入理解与应用
61 1