【问题标题】:-XX:+StressLCM, -XX:+StressGCM Options for JVM-XX:+StressLCM, -XX:+StressGCM JVM 选项
【发布时间】:2019-05-23 10:22:27
【问题描述】:

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

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

我还找到了添加这些的bug description,但解释对我来说毫无意义:

在 LCM/GCM 中随机化指令调度。

如果可能的话,有人可以用简单的英语解释他们的工作吗?

【问题讨论】:

  • 我想 LCM / GCM 代表本地代码运动 / 全局代码运动。编译器可以重新排序独立指令(不改变代码的语义)以优化 CPU 利用率。为了测试更多指令交错组合,给定的“压力”选项使这种重新排序变得不确定。
  • @apangin 默认情况下 重新排序独立指令 不是打开的吗?另外,当您说它们是“不确定的”时-您的意思是代码的语义已更改(可能是错误的)?有点迷茫……
  • 是的,指令重新排序(调度)默认开启。这就是 LCM/GCM 所做的。他们试图选择最优化的时间表。 StressLCM/GCM 不会选择最佳调度 - 相反,它们会在允许的约束范围内随机化调度,因此从程序员的角度来看,代码仍然有效。
  • @apangin 太棒了!为什么不让它成为答案?

标签: java jvm jvm-hotspot java-12


【解决方案1】:

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-03-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-03-29
    • 1970-01-01
    • 1970-01-01
    • 2015-04-06
    相关资源
    最近更新 更多