2010-07-05 43 views
1

想象的6-7服务器的设置具有相同的 Java版本 “1.6.0_18” OpenJDK的 运行时环境(IcedTea6 1.8)(Fedora的-36.b18.fc11-I386) OpenJDK的服务器VM都是相同的(构建14.0-B16,混合模式)任意JVM行为

每运行一个程序(内存和CPU密集型)几个小时甚至几天的时间,完成了多次成功(获得的统计数据之类的东西),但1号机,无论上(javac -source 1.5 * .java/javac -O -source 1.5,javac **,想象你自己的任何组合:))
或运行它(-Xms200000k或只是java bl abla.java你有这个想法)

我最终得到,而不是在特定时刻或迭代“java.lang.ArrayIndexOutOfBoundsException:-1341472392”?!第一件事情就是程序不会有这么大的价值,更不用说消极了。 (该行代码是一个包含调用ArrayList的整数)(该数字每次都不一样,因为我已经注意到)

还要注意,我可以“恢复”一个崩溃的测试,我可以在这台机器上,它做了更少的测试,再次崩溃。

没什么麻烦,我没有自己的盒子和所有其他的工作,但这对我来说很奇怪。

出于个人兴趣,OpenJDK在这个不太好看的情况下会发生什么?

+0

我有这个neg值的唯一想法是由溢出引起的......你测试了不同机器上的相同输入数据吗? – InsertNickHere 2010-07-05 13:34:22

+0

好点,是的,但是它在其他机器上运行得非常好。 “其他”物理上,但它们都包含错误,具有相同的硬件软件和内存大小。 – Recct 2010-07-05 14:18:26

回答

3

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

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

如果双或长变量未声明的挥发性,则负载的目的,存储,读取和写操作,它们被视为每个32位的两个变量:无论规则需要这些操作中的哪一个,都执行两个这样的操作,每个32位一半。双变量或长变量的64位编码为两个32位量的方式取决于实现。即使变量的类型是double或long,对volatile变量的加载,存储,读取和写入操作也是原子操作。

您可以尝试申报索引变量挥发性或者如果你怀疑这可能是问题(通过使用AtomicLong的或类似的东西例如)使用同步的一些其他手段。

+0

有趣的是,index变量是一个数组的元素,它依次被另一个循环索引,但它们都是整数,它是单线程的。 – Recct 2010-07-05 14:16:08

+0

所以没有gui例如? – aioobe 2010-07-05 16:43:05

0

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

+0

我看到(作为对上述评论的回复),它唯一的命令行。 – Recct 2010-07-05 17:07:08