如何防止编译器和JIT优化在java中破坏我的硬件测试?

时间:2017-04-28 18:56:29

标签: java hardware compiler-optimization

我最近发现DRAM中的位可以通过其中的粒子衰减或宇宙射线随机翻转。我想知道这种错误发生的频率。

不幸的是,我发现的最新统计数据来自1990年(source),其中指出每128 MB内存每月都会出现错误。

由于我无法在现代RAM中找到最近的软错误率统计数据,因此我尝试用java编写程序来测量4GB内存中的软错误率。我希望该程序可以检测分配的4GB RAM中的每个软错误,如果它没有以任何方式进行优化。

问题是,我不知道如何检查程序是否有效(我认为它不是因为优化),而且我不知道如何将其更改为按预期工作。< / p>

根据1990年的统计数据,我应该期望每22小时检测一次错误,因此我需要运行该程序将近一个星期,以99%的可信度运行它。假设现代硬件没有比90年代更好的软错误率。

以下循环是我程序中最重要的部分:

int[] memory = new int[1_073_741_824]; // 4GB array, each value initialized to 0
while (true) {
   for (int i = 0; i < memory.length; i++) {
        if (memory[i] != 0) {
            // soft error found
            memory[i] = 0;
            // print information about the error in a log file
        }
    }
    // Sleep for a minute
}

如何避免优化以破坏程序的预期用途?

P.S。如果您认为我的代码在没有优化的情况下甚至无法工作,请解释原因。

1 个答案:

答案 0 :(得分:0)

简单:只要您的循环体执行某些操作(例如只打印失败的索引),优化掉循环体就无效了!

如果有的话,那将是JIT优化的东西,javac在优化方面做的不仅仅是常数折叠。

但是,当然,您可以使用完全控制此类内容的语言来安全地使用。

除此之外:我怀疑你会遇到这样的代码错误。