【问题标题】:Monitor Java 8 ForkJoinPool监控 Java 8 ForkJoinPool
【发布时间】:2017-06-16 07:16:11
【问题描述】:

有没有办法监控Java ForkJoinPool 在一段时间内所做的事情,尤其是CountedCompleter 的执行效率如何?

  • 子任务执行需要多长时间?
  • 其中一项子任务是否比其他子任务长?
  • 它们是否并行执行?

应用于 CountedCompleter javadoc 中的触发器示例,监控工具会告诉我 PacketSender 的完成受 HeaderBuilder 的限制,它先开始但需要 13 秒,而 BodyBuilder 需要 4 秒并在之前完成。

我正在寻找这样的工具,主要是作为 Java 代理,以免不必要的统计数据污染我的生产代码,但一无所获。

感谢您的帮助

【问题讨论】:

  • 据我所知,这是个好问题,他们不得不在内部使用一些东西来测试这个......
  • 你好@Eugene,是的,这也是我的想法。让我们看看
  • Aleksey Shipilëv (shipilev.net) 对 Java7 的 FJP 进行了基准测试。我记得结果很糟糕。我没有看到 Java8 的基准测试。为了监控 FJ 类,您需要从 zip 文件中提取源代码并添加您自己的代码以跟踪事物。 FJ 班的很多工作只专注于工作,而不是提供统计数据。
  • 您好@edharned,我不知道该基准(发布链接?),但这并不是真正的问题。为了避免从源代码中提取类,我计划在 JDK 中原生使用检测 API,以添加一些统计信息。这样,代码仍然专注于工作:)
  • 好的。您可以使用 visualVM 查看大量使用的类。除此之外,您始终可以构建自己的。但是,这是一个很大的问题,但是,我不知道您将如何仅通过仪器来回答这三个问题。

标签: java concurrency java.util.concurrent


【解决方案1】:

最好的(实际上也是唯一的)方法是使用AOP 来“窥探”方法调用并记录开始和结束的时间戳以及可以收集用于统计分析的上下文。

我使用AspectJ 效果很好,可以推荐它,但是任何这样的库都应该可以工作。

【讨论】:

  • 您好 Bohemian,到目前为止,我通过使用 javassist 创建一个 java 代理来捕获计算的开始和结束,从而设法收集了各种统计信息。我现在的问题是正确导出它,因为我在标准输出中打印统计信息,生成了太多数据。我也会看看 AspectJ。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-03-07
  • 1970-01-01
相关资源
最近更新 更多