代码之家  ›  专栏  ›  技术社区  ›  Stepan Yakovenko

MangoDB Java驱动程序死锁

  •  0
  • Stepan Yakovenko  · 技术社区  · 6 年前

    我有多线程Java应用程序,我的5个线程(还有JETTY Web服务器的许多线程),其中一些是时不时地读/写MangGDB。有些写操作很密集,在这里我读了20万个MongoDB对象,但它们不会持续发生,只需几分钟就发生一次。几个小时的应用程序运行良好,但后来我看到了这种情况:

    enter image description here

    enter image description here

    https://gist.github.com/stiv-yakovenko/06b0d235fd2c32d839788edf56aaa6cd

    所有线程都在等待一个线程,而这个线程反过来又在等待mongo,而mongo什么都不做。 . 在问题开始之前,健康的情况是没有线程在等待其他任何人,因为负载不是那么高,无法阻止所有事情。在Mongo之前,我使用mapdb来存储相同的数据,我从未遇到过这样的问题。

    我看到过同样的情况,多个线程等待Mongo,所以我决定将所有MongoDB调用放在相同的ReentrantLock(true)下。我希望rootcause有太多的线程想要访问mongo,但是没有帮助。我不知道该怎么做,试图用简单的代码再现问题,但我不能。有什么想法吗?

    enter image description here

    1 回复  |  直到 6 年前
        1
  •  0
  •   Stepan Yakovenko    6 年前

    好吧,最后发现是垃圾收集。我最终使用了g1垃圾收集器。但这还不够,因为它无法提供所需的延迟(尽管它很接近)。我必须将应用程序分成两部分,一部分用于进行密集的垃圾产生计算,另一部分用于低延迟的Web响应。