mongodb java驱动程序中的死锁

时间:2018-12-29 20:51:53

标签: java multithreading mongodb deadlock

我有一个带有5个线程的多线程Java应用程序(还有来自码头网络服务器的许多线程),其中一些线程有时会读/写mongodb。有些写操作很费力,我读了20万个mongodb对象,但是它们并不是连续发生的,而是每几分钟发生一次。几个小时后,应用程序运行良好,但是后来我看到了这种情况:

enter image description here

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

enter image description here

这是我的jstack输出:

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

您会看到所有线程都在等待一个线程,而该线程又在等待mongo,而mongo却什么也没做。在出现问题之前,健康的情况是没有线程在等待其他任何人,因为负载并不高,无法阻塞所有内容。在mongo之前,我使用mapdb存储相同的数据,但从未遇到过类似的问题。

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

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

enter image description here

1 个答案:

答案 0 :(得分:0)

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