2009-02-16 31 views
9

Java memory model說明了線程如何通過內存進行交互可以和不能假設什麼。例如,如果一個線程在沒有適當同步的情況下將新值寫入一個字段,那麼新值不保證被其他線程觀察到。然而,在實踐中,其他線程可能會讀取新值,儘管同步不充分,具體取決於寫入和讀取之間的時間,硬件架構等。是否存在JVM的最壞情況實現?

這會導致難以發現並且難以重現的錯誤。因此,在最壞情況下的JVM上運行java應用程序非常有用,該應用程序在線程之間完全沒有存儲器同步,但在Java memory model的保證範圍之外。這種最糟糕的JVM實現是否存在?

+0

我以爲太陽寫了它。 – GEOCHET 2009-02-16 19:47:36

回答

2

您可以嘗試使用Terracotta來聚類您的程序。對於不正確的同步(即使集羣中只有一個節點會變得明顯),這是令人難以置信的。這是一個偉大的問題:我常常想正是這種能力 - 我很驚訝有沒有標準JRE -XXJMMExtreme

秦俑一個開關的開源和免費的基本產品。

0

我不知道任何確保最壞情況行爲的虛擬機,這似乎就是你所要求的。您所描述的情況可能會發生在Sun虛擬機(以及其他許多虛擬機)上,但僅限於緩存問題。我不熟悉一直有意這樣做的虛擬機。

0

有可能引發併發錯誤很多方面。

  • 將您的應用程序加載到比您通常期望的更多的線程中。確保這足以獲得99%以上的CPU。
  • 運行您的程序時啓用了分析器或禁用了JIT。這改變了您的應用程序的計時行爲。
  • 測試Java 5和Java 6(這通常是找到一些錯誤的最簡單和最好的方法)我還沒有發現使用Java 7的錯誤,它沒有出現在5/6中。

對於最壞情況下的JVM,請嘗試使用手機。 (你的應用程序可能根本不起作用);)

0

同步錯誤通常很難重現,因爲它們依賴於不同線程之間的微妙時間,所以沒有實際上試圖「只是運行你的程序」的實現總是可以「最壞的可能」。如果只執行一次這些指令,則不能複製兩種線程交錯指令的方式。在一次運行中測試所有這些組合是更不可能的。其他海報之一提出了Java Pathfinder,這聽起來像個好主意 - 但請注意,它是一個運行相同代碼多次的應用程序,所以您不能真正對待的只是另一個JVM實現。

另一個實用技巧是嘗試在儘可能多的不同JVM上運行應用程序。嘗試不同的供應商,來自同一供應商的不同版本,不同的CPU架構等等。幾年前,我曾經使用過多線程的應用程序,這些應用程序在Sun的JVM上開發,測試和運行,並且在Xeon CPU上運行良好。有一次,我嘗試在POWER架構上的IBM J9 Java虛擬機上運行它,並且在第一次嘗試時,由於同步錯誤,大約2/3的測試失敗。因此,在不同的環境下進行測試可以很好地揭示隱藏的同步問題。