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