为什么Java Just in Time Compiler会继续重新编译相同的方法并使方法成为非租用的

问题描述 投票:0回答:1

我正在Windows上使用AdoptJDk 11.0.7 Java,并启用了-XX:+ PrintCompilation标志,这样我就可以看到正在编译的方法而不是仅仅解释的方法

我正在应用程序中调用某些功能(该功能处理音频文件并在文件上创建html报告)。我启动了一次应用程序(GUI有限),然后在同一组文件上运行相同任务多次。第二次调用它的运行速度比第一次快得多,第三次比第二次要快一些,因此后续运行之间没有太大差异。但是我注意到,每次运行时,它仍在编译许多方法,并且许多方法变得不可重入。

这是分层编译,因此我知道可以将同一方法重新编译到更高的级别,但是正在编译的方法数量似乎并没有太大变化。

我不明白为什么这么多方法变成不可重入的(然后变成僵尸),我尚未进行详细的分析,但是似乎一遍又一遍地编译了相同的方法,为什么会那是什么?

我添加了-XX:-BackgroundCompilation选项,以强制按顺序编译方法,并使代码等待编译版本,而不是在编译时使用解释版本。这似乎减少了reentrant方法的数量,所以也许是因为它减少了多个线程尝试访问(重新)编译的方法的机会?

但是仍然有很多方法可以重新编译

例如,在这里我可以看到它被编译为3级,然后被编译为4级,因此3级编译成为不可进入的且僵化了。但是随后第4级变得不可重入,然后又回到第4级进行编译,依此类推。

enter image description here

java jit
1个回答
0
投票
简短的回答是,JIT取消优化会导致禁用已编译的代码(“使非进入者”),释放其代码(“使僵尸”)并在再次调用时重新编译(足够的次数)。
© www.soinside.com 2019 - 2024. All rights reserved.