引入:
上文讨论了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)等待被这个监视器通知到的线程列表。
时间: 2024-10-09 22:24:01