簡體   English   中英

是否存在JVM的最壞情況實現?

[英]Is there a worst case implementation of the JVM?

Java內存模型清楚地說明了線程如何通過內存進行交互可以和不可以假設的內容。 例如,如果一個線程在沒有適當同步的情況下將新值寫入字段,則不保證新值可由其他線程觀察到。 然而,實際上,盡管同步不充分,其他線程仍可能以任何方式讀取新值,具體取決於寫入和讀取之間的時間,硬件架構等。

這可能導致難以發現且難以復制的錯誤。 因此,在最壞情況的JVM上運行Java應用程序可能很有用,它在Java內存模型中的保證之外的線程之間絕對沒有內存同步。 是否存在這種最壞情況的JVM實現?

您可以嘗試使用Terracotta來聚類您的程序。 對於不正確的同步(即使集群中只有一個節點也會變得明顯),這是非常不可原諒的。 這是一個很好的問題:我經常想要這種能力 - 我很驚訝標准JRE -XXJMMExtreme沒有切換

Terracotta是開源的,免費提供基本產品。

這可能會有所幫助: http//javapathfinder.sourceforge.net/

同步錯誤通常難以重現,因為它們依賴於不同線程之間的細微時序,因此實際上只是“只運行程序”的實現並不總是“最糟糕的”。 如果只執行一次這些指令,則無法重現兩個線程可以交錯指令的多種不同方式。 在一次運行中測試所有這些組合的可能性更小。 其中一張海報建議使用Java Pathfinder,這聽起來不錯 - 但請注意,它是一個多次運行相同代碼的應用程序,因此您無法真正將其視為另一個JVM實現。

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

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

有很多方法可以觸發並發錯誤。

  • 將應用程序加載到比平常預期更多的線程。 確保這足以獲得99%以上的CPU。
  • 在啟用了Profiler或禁用JIT的情況下運行程序。 這會更改應用程序的計時行為。
  • 測試Java 5和Java 6(這通常是查找一些錯誤的最簡單和最好的方法)我沒有發現使用Java 7的錯誤,這個錯誤沒有出現在5/6中。

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM