引入: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)等待被這個監視器通知到的線程列表。