Java JFR 民间指南 - 事件详解 - jdk.ThreadAllocationStatistics (3)

jfrPeriodic.cpp

#define TRACE_REQUEST_FUNC(id) void JfrPeriodicEventSet::request##id(void) //使用了宏定义函数,实际函数就是 requestThreadAllocationStatistics(void) TRACE_REQUEST_FUNC(ThreadAllocationStatistics) { ResourceMark rm; //获取线程数量,虽然后面线程数量在采集过程中可能会改变,利用这个值初始化数组 int initial_size = Threads::number_of_threads(); //建立一个数组记录每个线程的分配大小 GrowableArray<jlong> allocated(initial_size); //建立一个数组记录线程号,和上面那个数组一一对应 GrowableArray<traceid> thread_ids(initial_size); //记录当前时间 JfrTicks time_stamp = JfrTicks::now(); //新建一个 JfrJavaThreadIterator 来遍历每个线程 JfrJavaThreadIterator iter; while (iter.has_next()) { JavaThread* const jt = iter.next(); assert(jt != NULL, "invariant"); //读取每个线程的 cooked_allocated_bytes() allocated.append(jt->cooked_allocated_bytes()); //记录线程号(包括系统线程号以及 Java 线程号) thread_ids.append(JFR_THREAD_ID(jt)); } //遍历数组,生成 JFR 事件并采集 for(int i = 0; i < thread_ids.length(); i++) { EventThreadAllocationStatistics event(UNTIMED); //设置当前线程已分配大小 event.set_allocated(allocated.at(i)); //设置线程信息 event.set_thread(thread_ids.at(i)); //设置结束时间 event.set_endtime(time_stamp); event.commit(); } }

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/zydpxz.html