Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/wpf/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 避免JVM在代码的关键部分停止运行_Java_Garbage Collection_Jvm_Jvm Hotspot_Jvm Crash - Fatal编程技术网

Java 避免JVM在代码的关键部分停止运行

Java 避免JVM在代码的关键部分停止运行,java,garbage-collection,jvm,jvm-hotspot,jvm-crash,Java,Garbage Collection,Jvm,Jvm Hotspot,Jvm Crash,我试图解决一个问题,我想确保在不同机器上运行的多个进程之间的互斥性。我希望确保始终有一个且只有一个进程执行关键部分。为了实现这一点,我在数据库中维护了一个锁,该锁会随着时间的推移而过期。它过期是为了避免饥饿 现在,鉴于JVM可以随时进入停止世界(STW)状态,这意味着,如果一个进程在STW中的时间足够长,另一个进程可以进入关键部分。我想知道- 在JVM启动STW之前,是否有方法通知/杀死线程 如果有一种方法可以在线程处于代码的关键部分时配置JVM而不执行STW 应用程序是否有办法指定JVM的“安

我试图解决一个问题,我想确保在不同机器上运行的多个进程之间的互斥性。我希望确保始终有一个且只有一个进程执行关键部分。为了实现这一点,我在数据库中维护了一个锁,该锁会随着时间的推移而过期。它过期是为了避免饥饿

现在,鉴于JVM可以随时进入停止世界(STW)状态,这意味着,如果一个进程在STW中的时间足够长,另一个进程可以进入关键部分。我想知道-

  • 在JVM启动STW之前,是否有方法通知/杀死线程
  • 如果有一种方法可以在线程处于代码的关键部分时配置JVM而不执行STW
  • 应用程序是否有办法指定JVM的“安全点”
  • 是否有一种方法可以将JVM配置为崩溃,而不是进入STW

  • PS:我知道我在基于JVM配置创建的锁上会有一个非常大的超时。它将确保JVM STW在锁到期之前完成。但这不是未来的证据,也不是讨论的重点。我也没有寻找减少SWT数量或STW持续时间的方法,因为他们没有我正在寻找的保证。

    存在专门的实时JVM,他们通常有专门的无分配线程,不会在GCs上挂起。但这些通常是针对嵌入式系统的,如果您的目标只是避免释放DB锁,那么它们将是一个相当迟钝的工具

    或者,Redhat提供了OpenJDK版本,其中包含Shenandoah和Azul以及C4,它们几乎是无暂停收集器

    或者,您可以简单地调整JVM,使暂停时间低于锁定超时

    为了实现这一点,我在数据库中维护了一个锁,该锁会随着时间的推移而过期

    你应该考虑实现无锁读拷贝(原子)更新算法。p> 如果任务不是幂等的,则会看到不一致性

    因此,使任务幂等将是另一种选择


    一般来说,如果应用程序的一致性保证依赖于一个可以自发违反的锁,那么您的应用程序设计似乎是不正确的。

    存在专门的实时JVM,它们通常有专门的无分配线程,不会在GCs上挂起。但这些通常是针对嵌入式系统的,如果您的目标只是避免释放DB锁,那么它们将是一个相当迟钝的工具

    或者,Redhat提供了OpenJDK版本,其中包含Shenandoah和Azul以及C4,它们几乎是无暂停收集器

    或者,您可以简单地调整JVM,使暂停时间低于锁定超时

    为了实现这一点,我在数据库中维护了一个锁,该锁会随着时间的推移而过期

    你应该考虑实现无锁读拷贝(原子)更新算法。p> 如果任务不是幂等的,则会看到不一致性

    因此,使任务幂等将是另一种选择


    通常,如果应用程序的一致性保证依赖于一个可能会自发违反的锁,那么您的应用程序设计似乎是不正确的。

    有一些技术可以减少JVM暂停,但无法禁用它们。正常JVM操作需要STW暂停。此外,JVM不仅可以暂停应用程序,还可以暂停底层操作系统,除非您在实时操作系统上运行某种实时JVM。@apangin感谢您的评论。顺便说一句,我不想禁用STW。我正在寻找一些方法——得到通知,或者让STW在关键线程上调用一些操作,或者让应用程序指定一个安全点来运行STW。谢谢你提到暂停。我知道操作系统也会导致暂停,但我现在不想寻找操作系统暂停的解决方案。是否对否决票发表评论?如果我的问题缺乏细节,或者措辞更好,或者可能只是下一次的学习,我会想改进我的问题。似乎你最好使用其他解决方案,比如Apache Zookeeper leader election。@yegodm谢谢你的建议。我评估过类似的解决方案。但是,如果我们假设JVM可以进入STW一段不合理(可能不实际)的时间,并且可以恢复,那么解决方案就失败了。有一些技术可以减少JVM暂停,但没有办法禁用它们。正常JVM操作需要STW暂停。此外,JVM不仅可以暂停应用程序,还可以暂停底层操作系统,除非您在实时操作系统上运行某种实时JVM。@apangin感谢您的评论。顺便说一句,我不想禁用STW。我正在寻找一些方法——得到通知,或者让STW在关键线程上调用一些操作,或者让应用程序指定一个安全点来运行STW。谢谢你提到暂停。我知道操作系统也会导致暂停,但我现在不想寻找操作系统暂停的解决方案。是否对否决票发表评论?如果我的问题缺乏细节,或者措辞更好,或者可能只是下一次的学习,我会想改进我的问题。似乎你最好使用其他解决方案,比如Apache Zookeeper leader election。@yegodm谢谢你的建议。我评估过类似的解决方案。但是如果我们假设JVM可以进入STW进行不合理(可能不实际)的时间,并且可以恢复,那么解决方案就失败了。感谢您的回复。这些都是有价值的建议。在最坏的情况下,我正在寻找优化JVM的选项,以便有一个有界的STW暂停,然后锁定持续时间可以基于这个数字。我理解你为什么会说“设计似乎不正确”。一个保证没有锁冲突的解决方案需要更强的原语(原子性),这在性能方面有更高的成本。所以,我正在考虑权衡。谢谢你的回复。这些都是有价值的建议。在最坏的情况下,我正在寻找优化JVM的选项,以便有一个有界的STW暂停,然后锁定持续时间可以基于t