我正在寻找一种方法来列出运行中的并行Java应用程序的所有同步调用,以便检测可伸缩性问题(以线程/核心为衡量标准)。据我所知,每次进入同步块时,机器都需要同步缓存。这会影响所有正在运行的CPU(以多种方式,如内存带宽),即使运行任务没有被进入同步区域所阻塞。
设置:
我有一个大型应用程序,其并行化在更高级别上进行,即执行并行的复杂任务。并行化工作在术语上,即所有核心都处于负载状态,而且没有阻塞的线程。尽管如此,性能与核心不成比例,这可能有几个原因。我感兴趣的特定可能原因是是否存在大量同步调用(例如进入同步块,使用锁等)。
任务:
我想找出代码中(实际执行的)有此同步调用的地方,并确定每个同步操作实际上执行了多少次。由于有许多引用库,因此无法仅对同步关键字或类似关键字进行常规代码搜索,因为这将搜索许多从未执行的代码并带来许多错误结果。完美的解决方案是拥有一个分析器,它列出了所有已执行的同步位置和调用次数。然而,我尝试过的分析器只允许计算方法调用次数。因此,问题在于找到所有实际相关的方法。
另外,如果我可以找到由某个入口点(主方法)引用的同步位置,也将有所帮助。即通过递归遍历代码并检查所有引用的方法,类等是否具有这种同步功能。在这种情况下,以后可以使用常规分析器找出频率。
问题:
是否有工具或工作流程能够针对更大的项目完成上述任务?感谢您提前回答。
设置:
我有一个大型应用程序,其并行化在更高级别上进行,即执行并行的复杂任务。并行化工作在术语上,即所有核心都处于负载状态,而且没有阻塞的线程。尽管如此,性能与核心不成比例,这可能有几个原因。我感兴趣的特定可能原因是是否存在大量同步调用(例如进入同步块,使用锁等)。
任务:
我想找出代码中(实际执行的)有此同步调用的地方,并确定每个同步操作实际上执行了多少次。由于有许多引用库,因此无法仅对同步关键字或类似关键字进行常规代码搜索,因为这将搜索许多从未执行的代码并带来许多错误结果。完美的解决方案是拥有一个分析器,它列出了所有已执行的同步位置和调用次数。然而,我尝试过的分析器只允许计算方法调用次数。因此,问题在于找到所有实际相关的方法。
另外,如果我可以找到由某个入口点(主方法)引用的同步位置,也将有所帮助。即通过递归遍历代码并检查所有引用的方法,类等是否具有这种同步功能。在这种情况下,以后可以使用常规分析器找出频率。
问题:
是否有工具或工作流程能够针对更大的项目完成上述任务?感谢您提前回答。