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

标签 java garbage-collection jvm jvm-hotspot jvm-crash

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

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

  1. If there is a way a thread can be notified/killed before JVM starts STW?
  2. If there is a way I can configure JVM not do STW while a thread is in the critical section of the code?
  3. If there is a way an application could specify the 'safe points' to JVM?
  4. If there is a way I can configure JVM to crash instead of going into STW?

PS:据我了解,根据 JVM 配置创建的锁可能会出现非常大的超时。它将确保 JVM STW 在锁到期之前完成。但这并不是面向 future 的,也不是讨论的重点。我也不是在寻找减少 SWT 数量或 STW 持续时间的方法,因为他们无法保证我正在寻找的内容。

最佳答案

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

或者,Redhat 提供带有 Shenandoah 的 OpenJDK 构建和带有 C4 的 Azul,它们几乎是无暂停的收集器。

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

To achieve that, I maintain a lock in a database which expires with time.

您应该考虑实现无锁读取复制(原子)更新算法。

If the task is not idempotent, you see an inconsistency.

因此,使您的任务具有幂等性将是另一种选择。

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

关于java - 避免 JVM 在代码的关键部分停止运行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48292013/

相关文章:

java - 具有 ASM 的 JVM INVOKESPECIAL 私有(private)构造函数

Java堆空间内存泄漏

java - 在批处理文件中传递带有空格的 JVM 参数

java - 将单词转换为 Pig Latin

java - 将对象数组发送到 WebService

java 是 PSYoungGen 的停止世界事件

c# - 如何在 Visual Studio Tools For Office (VSTO) 2010 Outlook 加载项完成后进行清理

java - 如何防止列表字段自动刷新后显示重复数据

Java OpenGL 屏幕大小的纹理映射四边形

方法返回的java堆栈和对象