2010-07-05 48 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