在树莓派上运行一个小码头应用程序我注意到在第一次访问后,应用程序继续燃烧3%的CPU。快速检查显示我的笔记本电脑上的情况也是如此,%也是如此。用strace检查我发现了一个永无止境的序列
...
12:58:01.999717 clock_gettime(CLOCK_MONOTONIC, {2923, 200177551}) = 0
12:58:01.999864 futex(0x693a0f44, FUTEX_WAIT_BITSET_PRIVATE, 1, {2923, 250177551}, ffffffff) = -1 ETIMEDOUT (Connection timed out)
12:58:02.050090 futex(0x693a0f28, FUTEX_WAKE_PRIVATE, 1) = 0
12:58:02.050236 gettimeofday({1436093882, 50296}, NULL) = 0
12:58:02.050403 gettimeofday({1436093882, 50444}, NULL) = 0
12:58:02.050767 clock_gettime(CLOCK_MONOTONIC, {2923, 251228114}) = 0
...
(这是ubuntu 14.04上的Java 7,带有Jetty 9.3。*使用h2 db,以防万一为某人敲响任何铃声。)
我了解到捕获strace -f -tt -p <pid> -o out.txt
,grep for clock_gettime
,提取pid,sort和uniq -c
以找到最常调用clock_gettime
的线程就足够了。很好地绘制delta时间显示50毫秒的线。此外,PID可以在使用jvisualvm作为十六进制中的nid获取的线程转储中找到,并且结果是“ VM周期性任务线程”。但为什么这么经常?这似乎不是JVM的标准行为。