mongodb java 驱动程序中的死锁

Deadlock in mongodb java driver

我的多线程 java 应用程序有 ~5 个线程(还有许多来自 Jetty Web 服务器的线程),其中一些 reading/writing mongodb 不时出现。一些写入是密集的,我读取了 200K mongodb 对象,但它们不会连续发生,它们在几分钟内发生一次。几个小时的应用程序完美运行,但后来我看到这种情况:

Mongo 没有做任何工作,据我所知:

这是我的 jstack 输出:

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

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

我已经看到多个线程等待 mongo 的相同情况,所以我决定将所有 mongodb 调用置于同一个 ReentrantLock(true) 下。我希望根本原因是太多线程想要访问 mongo,但它无济于事。我不知道该怎么做,试图用简单的代码重现问题,但我做不到。有什么想法吗?

UPD:这是评论者之一要求的 jstat 输出:

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