JPDA 架構研究6 - Agent利用環境指針訪問VM (線程管理篇)

引入:數組

上篇文章講解了分類:內存管理,如今講線程類操做的接口。
jvm


分類2:線程類操做ide

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表示活着的線程的引用數組。it


c.SuspendThread.掛起某線程內存管理

jvmtiError
SuspendThread(jvmtiEnv* env,
            jthread thread)

一旦掛起某線程,則對應方法沒法返回直到另外有某個線程調用ResumeThread.io

它入參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)
相關文章
相關標籤/搜索