想象一下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上发生这种情况?
答案 0 :(得分:3)
听起来很奇怪。用于索引数组的变量是长的,还是受长变量的影响?在这种情况下,对变量的访问不保证是原子的:
来自http://java.sun.com/docs/books/jls/second_edition/html/memory.doc.html#28733
如果double或long变量未声明为volatile,则为了加载,存储,读取和写入操作的目的,它们被视为两个变量,每个变量32位:规则需要其中一个操作,执行两个这样的动作,每个32位一半。将双变量或长变量的64位编码为两个32位量的方式取决于实现方式。对volatile变量的加载,存储,读取和写入操作都是原子的,即使变量的类型是double或long。
如果您怀疑这可能是问题,您可以尝试将index-variable声明为volatile或使用其他一些同步方法(例如使用AtomicLong或类似方法)。
答案 1 :(得分:0)
如果这是一个单线程Java应用程序,我怀疑是硬件故障。当然,这可能很难证明,除非你有办法运行硬件(例如内存)诊断。