【发布时间】:2017-04-28 18:56:28
【问题描述】:
我最近发现 DRAM 中的位可以通过其中的粒子衰变或宇宙射线随机翻转。我想知道这个错误多久发生一次。
不幸的是,我发现的最新统计数据来自 1990 年 (source),它表明每个月每 128MB 内存都会发生一个错误。
由于我找不到任何关于现代 RAM 中软错误率的最新统计数据,因此我尝试用 java 编写一个程序来测量我的 4GB RAM 上的软错误频率。我希望程序能够检测分配的 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
}
我可以做些什么来避免优化破坏程序的预期用途?
附:如果您认为我的代码不经过优化就无法运行,请解释原因。
【问题讨论】:
-
是的,这将永远做你期望它做的事情,不是任何语言,尤其是 Java
-
@JarrodRoberson 你会在代码中进行哪些更改以有效测量软错误频率?
-
在每个人都跳到 OP 的背上之前,there has been a Java bug 其中数组的默认值未设置为零,可能会暴露堆内存信息。现在,OP 的建议有点疯狂,不,这可能不会发现任何内存错误,但如果他们不走运,它可能出现 JVM 错误。
-
(在本例中为 0),我们可以通过将每个条目与该值 (0) 进行比较来检测错误。 不,你不能,这个语句只是说明你有多少不知道您使用的工具(Java)如何工作(或在这种情况下不工作)。享受 D/K 效应吧!
-
你必须用像 C 这样的低级语言来做这种事情。即使那样,你也必须担心分页(除非你在实模式下重新启动,或者编写一个将虚拟内存直接映射到物理内存的内核)...
标签: java hardware compiler-optimization