Gibt es eine Worst-Case-Implementierung der JVM?

9

Das Java-Speichermodell macht deutlich, was über die Interaktion von Threads durch den Speicher angenommen werden kann und was nicht. Wenn beispielsweise ein Thread einen neuen Wert ohne entsprechende Synchronisation in ein Feld schreibt, ist nicht garantiert, dass der neue Wert von anderen Threads beobachtet werden kann. In der Praxis könnten jedoch andere Threads den neuen Wert trotz unzureichender Synchronisation lesen, abhängig von der Zeit zwischen Schreiben und Lesen, der Hardwarearchitektur usw.

Dies kann zu Fehlern führen, die schwer zu entdecken und schwer zu reproduzieren sind. Es könnte daher nützlich sein, eine Java-Anwendung auf einer Worst-Case-JVM auszuführen, die absolut keine Speichersynchronisierung zwischen Threads außerhalb der Garantien im Java-Speicher vorgenommen hat Modell . Gibt es solch eine JVM-Implementierung im schlimmsten Fall?

    
Inge 16.02.2009, 19:43
quelle

5 Antworten

2

Sie könnten versuchen, Terracotta zu verwenden, um Ihr Programm zu bündeln. Es ist unglaublich unversöhnlich um falsche Synchronisation (die sich selbst mit nur einem Knoten im Cluster zeigt). Das ist eine große Frage: Ich habe oft genau diese Fähigkeit gesucht - ich bin überrascht, dass es keinen Wechsel in der Standard JRE -XXJMMExtreme

gibt

Terrakotta ist Open-Source und kostenlos für das Basisprodukt.

    
oxbow_lakes 16.02.2009 19:52
quelle
1

Dies könnte helfen: Ссылка

    
TofuBeer 16.02.2009 19:56
quelle
0

Ich kenne keine VM, die das Worst-Case-Verhalten die ganze Zeit garantiert, was das zu sein scheint, was Sie verlangen. Die Situation, die Sie beschreiben, kann bei Sun VMs (und vielen anderen) auftreten, jedoch nur aufgrund von Caching-Problemen. Ich bin nicht vertraut mit einer VM, die dies absichtlich die ganze Zeit tut.

    
jsight 16.02.2009 19:52
quelle
0

Es gibt viele Möglichkeiten, die einen Nebenläufigkeitsfehler auslösen könnten.

  • Laden Sie Ihre Anwendung auf viele weitere Threads, als Sie normalerweise erwarten würden. Stellen Sie sicher, dass dies mehr als genug ist, um 99% + CPU zu erhalten.
  • Führen Sie Ihr Programm mit einem Profiler aktiviert oder die JIT deaktiviert. Dies ändert das Timing-Verhalten Ihrer Anwendung.
  • Testen Sie sowohl Java 5 als auch Java 6 (Dies ist oft der einfachste und der beste Weg, ein paar Bugs zu finden) Ich habe keinen Fehler mit Java 7 gefunden, der nicht in 5/6 auftaucht.

Im schlimmsten Fall JVM, versuchen Sie ein Mobiltelefon. (Ihre Anwendung wird wahrscheinlich überhaupt nicht funktionieren);)

    
Peter Lawrey 16.02.2009 20:35
quelle
0

Synchronisationsfehler sind normalerweise schwer zu reproduzieren, da sie von subtilen Timings zwischen verschiedenen Threads abhängen, so dass keine Implementierung, die tatsächlich versucht, "nur Ihr Programm auszuführen", immer "schlimmstmöglich" sein kann. Sie können nicht mehr als eine unterschiedliche Art reproduzieren, wie zwei Threads ihre Anweisungen verschachteln können, wenn Sie diese Anweisungen nur einmal ausführen. Das Testen all dieser Kombinationen in einem einzigen Lauf ist noch weniger möglich. Eines der anderen Poster schlug Java Pathfinder vor und das klingt nach einer guten Idee - aber beachte, dass es sich um eine App handelt, die denselben Code viele Male ausführt, also kann man sie nicht einfach als eine andere JVM-Implementierung behandeln.

Ein weiterer praktischer Tipp besteht darin, zu versuchen, die App auf so vielen verschiedenen JVMs wie möglich auszuführen. Probieren Sie verschiedene Hersteller, verschiedene Versionen desselben Herstellers, verschiedene CPU-Architekturen und so weiter aus. Vor ein paar Jahren hatte ich Erfahrung mit einer Multithread-basierten App, die auf Suns JVM auf Xeon-CPUs entwickelt, getestet und ausgeführt wurde, wo es sehr gut funktionierte. Irgendwann habe ich versucht, es auf IBMs J9 Java Virtual Machine auf der POWER-Architektur laufen zu lassen und auf den ersten Blick sind etwa 2/3 der Tests aufgrund von Synchronisationsfehlern fehlgeschlagen. Daher kann das Testen in verschiedenen Umgebungen ziemlich gut darin bestehen, versteckte Synchronisierungsprobleme aufzudecken.

    
Michał Kosmulski 27.02.2013 22:38
quelle