假设6-7服务器的设置与相同的java版本"1.6.0_18“OpenJDK运行时环境(IcedTea6 1.8) (fedora-36.b18.fc11-i 386) OpenJDK服务器VM (build 14.0-b16,混合模式)相同。
每个程序运行一个程序(内存和CPU密集型)数小时甚至几天,多次成功地完成(获取统计数据之类的东西),但在一台机器上,无论参数或我是如何编写的(javac -source 1.5 *. javac /javac -O -source 1.5,javac **,想象一下自己的组合:)
或者运行它(-Xms200000k或只运行java blabla.java,您就知道了)
我最终得到,而不是在特定的时刻或迭代"java.lang.ArrayIndexOutOfBoundsException:-1341472392“?!第一件事,程序将永远不会工作这么大的值,更不用说负。(代码行是一个包含整数的ArrayList调用)(正如我注意到的那样,这个数字每次都是不同的)
还请注意,我可以“恢复”一个崩溃的测试,我可以在这台机器上,它很少做更多的测试,再次崩溃。
没什么大不了的,我不拥有这些盒子,其他的也都在工作,但这对我来说很奇怪。
出于个人兴趣,这是如何发生在不太乐观-无论如何,OpenJDK?
发布于 2010-07-05 13:33:16
听起来很奇怪。用于索引数组的变量是长的,还是曾经受到长变量的影响?在这种情况下,对变量的访问不能保证是原子的:
来自http://java.sun.com/docs/books/jls/second_edition/html/memory.doc.html#28733
如果一个双变量或长变量未声明为易失性变量,则为了加载、存储、读取和写入操作,它们将被视为是两个变量,每个变量为32位:规则要求这些操作之一的地方,执行两个这样的操作,每32位半执行一个操作。双变量或长变量的64位编码成两个32位量的方式是与实现相关的。对易失性变量的加载、存储、读和写操作是原子的,即使变量的类型是双倍或长的。
如果您怀疑这可能是问题所在,可以尝试将索引变量声明为易失性变量,或者使用其他同步方法(例如使用AtomicLong或类似的方法)。
发布于 2010-07-05 14:30:02
如果这是一个单线程Java应用程序,我怀疑是硬件故障。当然,除非您有办法运行硬件(例如内存)诊断,否则很难证明这一点。
https://stackoverflow.com/questions/3179771
复制相似问题