繁体   English   中英

MongoDB Java驱动程序中的死锁

[英]Deadlock in mongodb java driver

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

在此处输入图片说明

据我了解,Mongo没有做任何工作:

在此处输入图片说明

这是我的jstack输出:

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

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

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

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

在此处输入图片说明

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM