是否有任何多线程跟踪JIT编译器的例子?

时间:2016-09-06 03:10:40

标签: multithreading compilation jit pypy luajit

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

我所知道的所有tracing JITs,例如LuaJITPyPy,都只是单线程的。

是否有任何跟踪支持多个用户线程的JIT的示例?如果没有,是否有任何技术原因导致这些不存在?

2 个答案:

答案 0 :(得分:3)

分析(跟踪)正在运行的多线程程序要困难得多,但也并非不可能。跟踪的重点是使运行时优于第一次优化编译器。如果线程是相互链接的,那么要修改代码的JIT不仅需要理解代码的执行方式,还需要了解其他线程的副作用。

当线程1需要访问内存中的大文件时,它是否会创建二级缓存刷新,导致线程2因其运行的代码外部原因而停止。 JIT必须了解这些相互作用。否则,当第二个线程的改进来自于认识到线程一个代码对第二个线程产生负面影响并试图消除缓存刷新时,它可能会花费大量时间来尝试优化第二个线程。

您是否正在考虑尝试编写自己的跟踪多线程JIT?它可以完成,但它参与其中。

答案 1 :(得分:2)

由于错误的前提,你的问题没有实际意义。 Oracle JVM / OpenJDK的HotSpot优化器是“一次一个方法JIT”。其基本技术之一是内联功能,通常称为“积极内联”,因为根据当前执行(以及其他提示)的概要分析,推测内联方法最有可能成为动态方法调度的目标。如果程序的运行时行为发生变化并且不再执行优化的代码路径,这甚至包括去优化的能力。

内联是基本的,因为当方法代码被内联到调用者中时,大多数其他代码优化只会发展它们的真正潜力,从而提供必要的上下文。

因此,使用HotSpot JVM,您已经拥有了一个利用已知执行路径的多线程优化环境。但是,不需要以描述为“跟踪”的方式收集此信息。由于此JVM能够随时创建线程堆栈跟踪的快照,因此它还可以在定义的时间间隔内查看跟踪,与对每个方法调用添加记录功能相比,可以更好地控制分析开销。因此,JVM可以将跟踪的获取限制为实际占用大量CPU时间的线程,并且本质上将获得实际的调用链,即使涉及的方法包含在不同线程的多个调用链中。