在玩一些 jcstress
代码时,我注意到两个对我来说很新的参数:StressLCM
和 StressGCM
。
我要做的第一件事就是在源代码本身中搜索这些,虽然我已经找到了一些东西,但仍然不清楚它们实际上做了什么。我真的很希望能在源代码中看到一些注释,这会带来一些启示,但没有运气。
我还找到了 bug description添加了这些,但解释对我来说没有意义:
Randomize instruction scheduling in LCM/GCM.
如果可能的话,有人可以用通俗易懂的英语解释一下他们的工作吗?
最佳答案
LCM/GCM 代表局部代码运动/全局代码运动。为了优化 CPU 利用率,编译器可能会在不更改代码语义的情况下重新排序独立指令。编译器试图找到最佳的(从性能角度)指令顺序。这称为指令调度,LCM/GCM 就是这样做的。
使用 -XX:+StressLCM
/-XX:+StressGCM
选项,指令调度的工作方式有点不同。它不再试图找到最佳调度,而是在允许的约束范围内选择随机指令顺序,仍然保持原始语义不变。这种不确定的行为有助于测试更多的指令交错组合,这对于发现微妙的并发问题至关重要。
关于java - -XX :+StressLCM, -XX:+JVM 的 StressGCM 选项,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56273136/