【发布时间】:2021-04-23 08:16:57
【问题描述】:
我正在研究一个概念上相当简单的 java 进程。它是一个单一的线程,不断地从各种来源获取数据并根据这些数据做出决策。我最近注意到 2 条日志行之间存在可疑延迟,我不希望在 2 条日志行之间发生太多处理。(数十英里的延迟与 1 到几英里的预期)
由于这种可疑的延迟并不总是存在,我的第一个想法是我在最大限度地减少垃圾收集需求方面做得很差,导致 JVM 在不需要的时间暂停执行。
虽然我仍然认为我在这方面做得不好,但这似乎不是原因。我添加了以下 JVM 参数:-Xlog:gc*=info,safepoint::timemillis,level,tags
我发现可疑的日志行之间没有停顿。这些 JVM 参数不会显示其他 JVM 暂停吗?
无论如何,Java 专业人士有什么建议可以尝试有效地追踪这种延迟的来源吗?我可以使用任何(最好是免费的)工具来监控和了解正在发生的事情?
环境信息:Linux 3.10,java 11。有问题的进程在一个独立的核心上运行,除此之外我没有做太多的调整。
【问题讨论】:
-
您是否尝试过使用 Flight Recorder + Mission Control 分析您的代码?
-
添加更多日志行。找到新的两条线,它们之间有间隙。在它们之间添加更多日志行。重复。只需要几次迭代就可以缩小范围。如果延迟开始在多条线路之间扩散,那么您会发现一堆 缓慢的东西。如果您获得比预期更多的日志行,您会发现意外的慢循环。
-
这也可能取决于您的登录方式。一个专用的
Logger?解析日志的FluentBit?System.out::println? -
@Eugene,好问题。我正在使用
java.util.logging.Logger实例 -
我没有看得太深,但我确实看到该记录器中的一些事情是在
synchronized锁定下完成的。这可以解释。也可能是一个文件也在那个时候旋转
标签: java performance optimization latency