JPDA 架構研究14 - Agent利用環境指針訪問VM(對象管理篇)

引入:jvm

上文討論了Agent如何利用環境指針訪問VM(管理類),這裏討論如何管理對象。ide


分類9:對象管理線程

a.GetObjectSize.  獲取對象的大小,指針

jvmtiError
GetObjectSize(jvmtiEnv* env,
            jobject object,
            jlong* size_ptr)

注意,這不是真實大小,這只是從對象的定義代碼中得到的一個預估值。code


b.GetObjectHashCode.獲取對象的hash值。對象

jvmtiError
GetObjectHashCode(jvmtiEnv* env,
            jobject object,
            jint* hash_code_ptr)


c.GetObjectMonitorUsage.獲取對象的監視器。hash

typedef struct {
    jthread owner;
    jint entry_count;
    jint waiter_count;
    jthread* waiters;
    jint notify_waiter_count;
    jthread* notify_waiters;
} jvmtiMonitorUsage;
jvmtiError
GetObjectMonitorUsage(jvmtiEnv* env,
            jobject object,
            jvmtiMonitorUsage* info_ptr)

這個方法值得一說,從返回值能夠看出,它能夠包含對象的監視器的如下信息:it

(1)監視器所在的線程class

(2)線程進入該監視器的次數thread

(3)等待擁有這個監視器的線程數。

(4)等待擁有這個監視器的線程列表。

(5)等待被這個監視器通知到的線程數。

(6)等待被這個監視器通知到的線程列表。

相關文章
相關標籤/搜索