有哪些支持多线程追踪 JIT 编译器的例子吗?

JVM 和 .NET CLR 都包含支持多个用户线程的即时编译器。然而,我相信这些是方法一次性的 JITs 。

我知道的所有追踪 JITs,例如 LuaJIT 和 PyPy,都只支持单线程。

有没有支持多个用户线程的追踪 JITs 的例子?如果没有,是否存在任何技术原因阻止了这些的出现?

点赞
用户2137931
用户2137931

Profiling (tracing) a running multi-threaded program is a lot harder, but also not impossible.

在运行多线程程序时进行跟踪(Profiling)是很困难的,但并非不可能。跟踪的整个目的是使得运行时比第一次优化编译器更好。如果线程相互关联,那么将修改代码的 JIT 必须理解代码在执行时不仅会产生什么副作用,还会对其他线程产生什么影响。

例如,当线程一需要访问内存中的大文件时,它是否会导致线程二因为无法访问而停顿?JIT 必须理解这类相互影响。否则,它可能会花费大量时间去优化线程二,而不是意识到线程一的代码会对线程二产生负面影响,尝试消除缓存刷新。

你是否考虑过尝试编写自己的跟踪多线程 JIT?

这是可以实现的,但需要做大量工作。

2016-09-13 17:34:48
用户2711488
用户2711488

你的问题由于错误的前提而变得无关紧要。 Oracle 的 JVM/OpenJDK 的 HotSpot 优化器 _不是_“一次编译一个方法 JIT”。其中一个基本技术是内联能力,通常称为“积极的内联”,因为它会假定在动态方法调度的情况下,可能是最可能的目标,基于当前执行的分析(和其他提示)。这甚至包括反优化的能力,如果程序的运行时行为发生变化并且不再执行优化的代码路径。

内联是基础,因为大多数其他代码优化只有在方法代码内联到调用者时才真正发挥潜力,从而提供必要的上下文。

因此,使用 HotSpot JVM,您已经拥有一个利用已知执行路径的多线程优化环境。虽然不需要像“跟踪”描述的那样收集这些信息。由于这个 JVM 能够在任何时间创建线程的堆栈跟踪快照,它也可以在定义的时间间隔内窥探跟踪,比添加记录功能到每个方法调用具有更多的控制性能。因此,JVM 可以将跟踪的获取限制为实际消耗显着 CPU 时间的线程,并且本质上会得到一个实际的调用链,即使涉及的方法包含在不同线程的多个调用链中。

2016-09-14 09:51:14