是否存在JVM的最坏情况实现?

时间:2009-02-16 19:43:58

标签: java multithreading memory synchronization jvm

Java memory model清楚地说明了线程如何通过内存进行交互可以和不可以假设的内容。例如,如果一个线程在没有适当同步的情况下将新值写入字段,则不保证新值可由其他线程观察到。然而,实际上,尽管同步不充分,其他线程仍可以读取新值,具体取决于写入和读取之间的时间,硬件架构等。

这可能导致难以发现且难以复制的错误。因此,在最坏情况的JVM上运行java应用程序非常有用,它在Java memory model中的保证之外的线程之间绝对没有内存同步。是否存在这种最坏情况的JVM实现?

5 个答案:

答案 0 :(得分:2)

您可以尝试使用Terracotta群集您的程序。对于不正确的同步(即使集群中只有一个节点也会变得明显),这是非常不可原谅的。这是一个伟大的问题:我经常想要这种能力 - 我很惊讶标准JRE中没有切换-XXJMMExtreme

Terracotta是开源的,免费提供基本产品。

答案 1 :(得分:1)

这可能会有所帮助:http://javapathfinder.sourceforge.net/

答案 2 :(得分:0)

我不知道任何VM始终保证最坏的情况,这似乎是你要求的。您正在描述的情况可能发生在Sun VM(以及许多其他虚拟机)上,但仅由于缓存问题。我不熟悉一直故意这样做的虚拟机。

答案 3 :(得分:0)

有很多方法可以触发并发错误。

  • 将应用程序加载到比平常预期更多的线程。确保这足以获得99%以上的CPU。
  • 在启用了分析器或禁用JIT的情况下运行程序。这会改变应用程序的计时行为。
  • 测试Java 5和Java 6(这通常是查找一些错误的最简单和最好的方法)我没有发现使用Java 7的错误,该错误未在5/6中出现。

对于最坏情况的JVM,请尝试使用手机。 (你的申请可能根本不起作用);)

答案 4 :(得分:0)

同步错误通常难以重现,因为它们依赖于不同线程之间的细微时序,因此实际上只是“只运行程序”的实现并不总是“最糟糕的”。如果只执行一次这些指令,则无法重现两个线程可以交错指令的多种不同方式。在一次运行中测试所有这些组合的可能性更小。其中一个海报建议使用Java Pathfinder,这听起来不错 - 但请注意,它是一个多次运行相同代码的应用程序,因此您无法真正将其视为另一个JVM实现。

另一个实用技巧是尝试在尽可能多的不同JVM上运行应用程序。尝试不同的供应商,来自同一供应商的不同版本,不同的CPU架构等。几年前,我有一个大型多线程应用程序的经验,该应用程序已在Xeon CPU上的Sun JVM上开发,测试和运行,并且运行良好。有一次我尝试在POWER架构上的IBM J9 Java虚拟机上运行它,并且在第一次尝试时,由于同步错误,大约有2/3的测试失败了。因此,在不同环境中进行测试可以很好地揭示隐藏的同步问题。