引入:

上文讨论了Agent如何利用环境指针访问VM(管理类),这里讨论如何管理对象。


分类9:对象管理

a.GetObjectSize.  获取对象的大小,

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

注意,这不是真实大小,这只是从对象的定义代码中获得的一个预估值。


b.GetObjectHashCode.获取对象的hash值。

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


c.GetObjectMonitorUsage.获取对象的监视器。

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)

这个方法值得一说,从返回值可以看出,它可以包含对象的监视器的以下信息:

(1)监视器所在的线程

(2)线程进入该监视器的次数

(3)等待拥有这个监视器的线程数。

(4)等待拥有这个监视器的线程列表。

(5)等待被这个监视器通知到的线程数。

(6)等待被这个监视器通知到的线程列表。