为什么延迟堆栈跟踪中没有平均值?

时间:2018-11-01 11:34:59

标签: java average latency jfr

当我使用Java Mission Control打开.jfr文件(Java飞行记录)时,可以在线程->延迟->延迟堆栈跟踪选项卡中找到“堆栈跟踪”,“最长”和“计数”。我关心的是平均值,而不是最长的。 “ Java延迟”选项卡中有平均值,但是它包含与事件类型相关的所有延迟。其中一些对我来说毫无意义,例如:

sun.misc.Unsafe.park(boolean, long) 
    295,569,155,245 436,427

java.util.concurrent.locks.LockSupport.park(Object) 
    295,569,155,245 344,030

java.util.concurrent.locks.AbstractQueuedSynchronizer$ConditionObject.await()   
    295,569,155,245 263,418

java.util.concurrent.LinkedBlockingQueue.take() 
    63,773,776,315  257,531

java.util.concurrent.ThreadPoolExecutor.getTask()   
    63,773,776,315  257,511

java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor$Worker)    
    63,773,776,315  257,511

java.util.concurrent.ThreadPoolExecutor$Worker.run()    
    63,773,776,315  257,511

java.lang.Thread.run()  
    63,773,776,315  257,511

以上是线程池的空闲时间,正在等待下一个任务。此堆栈轨迹和所有其他堆栈轨迹混合在一起的平均值是毫无意义的。我只关心业务堆栈跟踪的延迟。 如何获得特定延迟堆栈跟踪的平均值。我可以将原始数据导出到csv,然后可以自己计算。

1 个答案:

答案 0 :(得分:1)

为保持较低的开销,Flight Recorder仅记录异常值。例如。如果等待时间的持续时间低于20毫秒,则不会记录。

可以对延迟进行采样,以获得平均延迟的近似值,但是到目前为止(JDK 11)尚不可用。