-XX:+StressLCM, -XX:+JVM 的 StressGCM 选项

-XX:+StressLCM, -XX:+StressGCM Options for JVM

在玩一些 jcstress 代码时,我注意到两个对我来说很新的参数:StressLCMStressGCM

我要做的第一件事就是在源代码本身中搜索这些,虽然我已经找到了一些东西,但仍然不清楚它们 实际上 做了什么。我真的很希望能在源代码中看到一些注释,这会带来一些启示,但没有运气。

我也找到了 bug description 添加了这些内容,但解释对我来说没有意义:

Randomize instruction scheduling in LCM/GCM.

有人可以解释一下他们的工作吗?如果可能的话,用通俗易懂的英语解释一下?

LCM / GCM 代表本地代码运动/全局代码运动。为了优化 CPU 利用率,编译器可能会在不更改代码语义的情况下重新排序独立指令。编译器试图找到最佳的(从性能角度)指令顺序。这称为指令调度,LCM / GCM 就是这样做的。

使用 -XX:+StressLCM / -XX:+StressGCM 选项,指令调度的工作方式有点不同。它不再试图找到最佳调度,而是在允许的约束范围内选择随机指令顺序,仍然保持原始语义不变。这种不确定的行为有助于测试更多的指令交错组合,这对于发现微妙的并发问题至关重要。