我假设您想知道为什么配置文件下面没有 Java 框架clock_gettime
。
如您所见,堆栈以[unknown_Java]
frame 结束。这意味着,线程确实运行了一些 Java 代码,但 async-profiler 无法获取 Java 堆栈跟踪,因为 JVM 无法找到顶部 Java 帧。
发生这种情况是因为System.nanoTime()
并且System.currentTimeMillis()
是 JVM 内在函数。它们被 JIT 编译为相应 C 函数的直接调用,而无需将线程从状态切换in_java
到in_native
状态。nanoTime
这意味着,JVM 在调用or时没有保存指向最后一个 Java 帧的指针currentTimeMillis
,因此在异步堆栈遍历期间发现最后一个 Java 帧时存在问题。
不幸的是,async-profiler 对此无能为力。一种可能的解决方法是禁用相应的 JVM 内在函数:
java -XX:+UnlockDiagnosticVMOptions -XX:DisableIntrinsic=_currentTimeMillis,_nanoTime
顺便说一句,我在你的火焰图中发现奇怪的是clock_gettime
调用内核。通常它不应该,因为它是在映射到进程用户空间的vDSOclock_gettime
中实现的。原因可能是错误的时钟源/禁用的 vDSO ( 1 , 2 )。