首页 > 解决方案 > Java 识别延迟源

问题描述

我正在研究一个概念上相当简单的java进程。它是一个单一的线程,不断地从各种来源获取数据并根据这些数据做出决策。我最近注意到 2 个日志行之间存在可疑延迟,我不希望在 2 个日志行之间发生太多处理。(数十英里的延迟与 1 到几英里的预期)

由于这种可疑的延迟并不总是存在,我的第一个想法是我在最大限度地减少垃圾收集的需求方面做得很差,导致 JVM 在不需要的时间暂停执行。

虽然我仍然相信我在这方面做得不好,但这似乎不是原因。我添加了以下 JVM 参数:-Xlog:gc*=info,safepoint::timemillis,level,tags 并且我在可疑的日志行之间没有看到任何停顿。这些 JVM 参数不会显示其他 JVM 暂停吗?

无论如何,java专业人士有什么建议可以尝试有效地追踪这种延迟的来源吗?我可以使用任何(最好是免费的)工具来监控和了解正在发生的事情?

环境信息:Linux 3.10,java 11。有问题的进程在一个独立的核心上运行,除此之外我没有做太多的调整。

标签: javaperformanceoptimizationlatency

解决方案


取决于信息的来源,可能是获取信息的延迟。就像它必须连接到服务器一样,那么服务器的连接和查询可能会引入这种延迟。或者您访问磁盘的速度太快,并且您受到驱动器速度的限制。除此之外,我不确定。也许添加其中一些。

long time = System.currentTimeMillis();
foo();
System.err.println(System.currentTimeMillis() - time + "ms");

推荐阅读