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



i最近发现,dram中的位可以被其中的颗粒或宇宙射线随机翻转。我想知道这个错误的频率。

不幸的是,我发现的最新统计量是从1990年(来源(,该年份指出,每128mb的内存每个月都应发生错误。

由于我找不到现代公羊中软错误率的最新统计量,因此我试图在Java中编写一个程序来测量RAM 4GB的软误差频率。我希望该程序可以在分配的4GB RAM中检测到的所有软错误,如果它没有以任何方式进行优化。

问题是,我不知道该如何检查程序是否有效(我认为这不是由于优化而不是(,而且我不知道如何将其更改为预期的工作。

根据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。如果您认为我的代码甚至没有优化都无法正常工作,请解释原因。

简单:一旦您的循环主体做某事(例如打印索引失败(,优化循环主体就会无效!

,如果有的话,这将是JIT优化事物,Javac并不是在优化方面做的不断折叠要多得多。

但是,当然,您将使用完整控制此类内容的语言在安全方面处于安全方面。

除此之外:我宁愿怀疑您是否会使用此类代码遇到错误。

最新更新