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,如需转载请自行联系原作者
目录
相关文章
|
2月前
使用指针访问数组元素
【10月更文挑战第30天】使用指针访问数组元素。
40 3
|
7天前
|
存储 JavaScript 开发工具
基于HarmonyOS 5.0(NEXT)与SpringCloud架构的跨平台应用开发与服务集成研究【实战】
本次的.HarmonyOS Next ,ArkTS语言,HarmonyOS的元服务和DevEco Studio 开发工具,为开发者提供了构建现代化、轻量化、高性能应用的便捷方式。这些技术和工具将帮助开发者更好地适应未来的智能设备和服务提供方式。
30 8
基于HarmonyOS 5.0(NEXT)与SpringCloud架构的跨平台应用开发与服务集成研究【实战】
|
17天前
|
机器学习/深度学习 算法 数据可视化
基于深度混合架构的智能量化交易系统研究: 融合SSDA与LSTM自编码器的特征提取与决策优化方法
本文探讨了在量化交易中结合时序特征和静态特征的混合建模方法。通过整合堆叠稀疏降噪自编码器(SSDA)和基于LSTM的自编码器(LSTM-AE),构建了一个能够全面捕捉市场动态特性的交易系统。SSDA通过降噪技术提取股票数据的鲁棒表示,LSTM-AE则专注于捕捉市场的时序依赖关系。系统采用A2C算法进行强化学习,通过多维度的奖励计算机制,实现了在可接受的风险水平下最大化收益的目标。实验结果显示,该系统在不同波动特征的股票上表现出差异化的适应能力,特别是在存在明确市场趋势的情况下,决策准确性较高。
55 5
基于深度混合架构的智能量化交易系统研究: 融合SSDA与LSTM自编码器的特征提取与决策优化方法
|
2月前
|
存储 编译器 Linux
【c++】类和对象(上)(类的定义格式、访问限定符、类域、类的实例化、对象的内存大小、this指针)
本文介绍了C++中的类和对象,包括类的概念、定义格式、访问限定符、类域、对象的创建及内存大小、以及this指针。通过示例代码详细解释了类的定义、成员函数和成员变量的作用,以及如何使用访问限定符控制成员的访问权限。此外,还讨论了对象的内存分配规则和this指针的使用场景,帮助读者深入理解面向对象编程的核心概念。
152 4
|
2月前
使用指针访问数组元素
【10月更文挑战第31天】使用指针访问数组元素。
53 2
|
3月前
|
机器学习/深度学习 人工智能 安全
北大领衔,多智能体强化学习研究登上Nature子刊
【10月更文挑战第1天】近日,北京大学领导的研究团队在《Nature》子刊上发表了一篇关于多智能体强化学习的论文,提出了一种高效且可扩展的框架,解决了大规模网络控制系统中的决策问题。该框架通过局部通信避免了集中式和独立学习的缺点,在交通、电力等领域的实验中展现了卓越性能。然而,其在更复杂系统中的效果及计算复杂度仍需进一步验证。论文链接:https://www.nature.com/articles/s42256-024-00879-7。
57 3
|
3月前
|
设计模式 前端开发 JavaScript
深入探索研究MVVM架构设计
【10月更文挑战第7天】
47 0
|
2月前
|
存储 C语言
C语言如何使用结构体和指针来操作动态分配的内存
在C语言中,通过定义结构体并使用指向该结构体的指针,可以对动态分配的内存进行操作。首先利用 `malloc` 或 `calloc` 分配内存,然后通过指针访问和修改结构体成员,最后用 `free` 释放内存,实现资源的有效管理。
161 13
|
3月前
|
C语言
无头链表二级指针方式实现(C语言描述)
本文介绍了如何在C语言中使用二级指针实现无头链表,并提供了创建节点、插入、删除、查找、销毁链表等操作的函数实现,以及一个示例程序来演示这些操作。
41 0

热门文章

最新文章