避免JVM在代码的关键部分停止世界

时间:2018-01-17 00:39:16

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

我试图解决一个问题,我希望确保在不同计算机上运行的多个进程之间相互排斥。我想确保始终只有一个进程执行临界区。为了实现这一点,我在数据库中保持锁定,该数据库随时间过期。它会过期以避免饥饿。

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

  
      
  1. 如果有一种方法可以在JVM启动STW之前通知/杀死线程?
  2.   
  3. 如果有一种方法我可以配置JVM而不是STW,而一个线程在代码的关键部分?
  4.   
  5. 如果某种方式可以让应用程序指定安全点'到JVM?
  6.   
  7. 如果有办法我可以将JVM配置为崩溃而不是进入STW?
  8.   

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

1 个答案:

答案 0 :(得分:2)

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

另外,Redhat提供带有Shenandoah的OpenJDK版本和带有C4的Azul,它们几乎是无法暂停的收藏家。

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

  

为了实现这一点,我在数据库中保持锁定,该数据库随时间过期。

您应该考虑实现lockfree read-copy-(原子)更新算法。

  

如果任务不是幂等的,则会发现不一致。

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

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