1

想象一下,6-7 台服务器的设置都与相同的 java 版本“1.6.0_18”OpenJDK 运行时环境 (IcedTea6 1.8) (fedora-36.b18.fc11-i386) OpenJDK Server VM(build 14.0-b16,混合模式)相同

每个人都运行一个程序(内存和 CPU 密集型)数小时甚至数天,多次成功完成(获取统计数据之类的东西),但在一台机器上,无论参数或我如何编译(javac -source 1.5 * .java/javac -O -source 1.5,javac **,自己想象任何组合:))
或运行它(-Xms200000k 或只是 java blabla.java 你明白了)

我最终得到,而不是在特定时刻或迭代“java.lang.ArrayIndexOutOfBoundsException:-1341472392”?!首先,该程序永远不会使用如此大的值,更不用说负值了。(代码行是一个包含整数的 ArrayList 调用)(这个数字每次都不同,正如我所注意到的)

另请注意,我可以“恢复”崩溃的测试,并且我可以在这台机器上进行更多测试,再次崩溃。

没什么麻烦,我不拥有这些盒子,而其他所有的盒子都可以工作,但这对我来说很奇怪。

出于个人兴趣,这在无论如何都不太乐观的 OpenJDK 上是如何发生的?

4

2 回答 2

3

听起来很奇怪。用于索引数组的变量是长变量,还是曾经受长变量影响?在这种情况下,不能保证对变量的访问是原子的:

来自http://java.sun.com/docs/books/jls/second_edition/html/memory.doc.html#28733

如果 double 或 long 变量未声明为 volatile,则出于加载、存储、读取和写入操作的目的,它们被视为每个 32 位的两个变量:只要规则需要这些操作之一,两个这样的操作执行操作,每个 32 位一半执行一个操作。将 double 或 long 变量的 64 位编码为两个 32 位量的方式取决于实现。对 volatile 变量的加载、存储、读取和写入操作是原子的,即使变量的类型是 double 或 long。

如果您怀疑这可能是问题所在,您可以尝试将索引变量声明为 volatile 或使用其他一些同步方式(例如使用 AtomicLong 或类似方法)。

于 2010-07-05T13:33:16.503 回答
0

如果这是一个单线程 Java 应用程序,我怀疑是硬件故障。当然,这可能很难证明,除非您有办法运行硬件(例如内存)诊断程序。

于 2010-07-05T14:30:02.880 回答