-
Notifications
You must be signed in to change notification settings - Fork 1.1k
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
线上死锁 #914
Comments
这不是死锁,只是慢,你是不是本地缓存太多了。还有那个缓存失效通知,默认是关闭的,无脑打开只会死得快 |
我看了下这里代码没有问题,性能可以略微优化,我稍后改改,但解决不了你的本质问题 |
本地cache多可以用CaffeineCache |
好的,感谢您的回复,我尝试优化一下。 |
第一个图表示正在clean占据了锁,第二个图表示正在等clean完成(LinkedHashMapCache.java:94),如果没有第三个图揭示在等什么别的东西,那就还是map里面东西太多导致clean太慢了。 之前的程序在Cleaner类里面加了一把大锁,这里已经优化还未发布,不过和你给出的两个图无关。 另外,线程A(或多个线程)等线程B释放锁,而线程B执行较慢迟迟不释放,这不叫死锁。线程A持有锁1,线程B持有锁2,线程A等待锁2,线程B等待锁1,永远互相锁住,这才是死锁。 |
这里或许还可以优化下,但是local cache太多的话还是不好哈,毕竟LinkedHashMapCache只是自己做的一个简单的local cache |
我猜到一个可能的原因,或许和这个提交有关,2.7.5和2.7.6会受到影响,你可以把版本改为2.7.4试试。 |
问题是这样的,为了更好的适应java21,在这个修改里面把synchronized换成了ReentrantLock。进一步他使用了ReentrantReadWriteLock,本意是为了提升一点点性能。但之前他没注意,我也遗漏了,其实LinkedHashMap的读操作也是带有更新的,所以就可能会导致并发问题。 我本想把这里重新写一下,但还是从简吧,马上就发布。 |
感谢师兄😄 |
版本
2.7.5
场景
这是线上的一个死锁场景,服务使用的xxl-job跑的定时任务,任务中调用了jetcache注解缓存的方法,跑一段时间定时任务就都停了,查看线程发现是死锁了,具体原因不清楚,因为我技术一般,大佬如果有空帮忙可以看一眼。
死锁截图
The text was updated successfully, but these errors were encountered: