
文章插图

文章插图
封装不严谨导致的死锁jstack打出的死锁信息如下所示 。grpc-default-executor-3449线程拿到了RaftLog的锁 , 在等DataBlockingQueue的锁;SegmentedRaftLogWorker拿到了DataBlockingQueue的锁 , 在等RaftLog的锁 。

文章插图

文章插图
这里最值得怀疑的是SegmentedRaftLogWorker拿到了DataBlockingQueue的锁却不释放 , 因为queue的操作只是在队列里增、删、查元素 。如下图所示DataBlockingQueue的方法poll , 使用的锁是自己封装的锁AutoCloseableLock implement AutoCloseable,锁的释放依赖于AutoCloseableLock重载的close方法 。

文章插图
再看acquire方法 , 先用lock.lock()拿到锁 , 再创建新的AutoCloseableLock对象 , 如果拿到锁后 , 在创建新对象AutoCloseableLock时发生OOM等异常 , 锁就无法释放 。

文章插图
参考
[1]https://www.waitingforcode.com/Apache-spark/apache-spark-off-heap-memory/read
[2]https://github.com/alibaba/arthas/releases/tag/arthas-all-3.3.6
[3]https://www.jaegertracing.io/docs/1.18/getting-started/
[4]https://stackoverflow.com/questions/3537870/production-settings-file-for-log4j/
推荐阅读
- 排名前5的JavaScript框架
- Linux 上部署 Java 应用绕不开的命令,撒花啦
- java 实现 SelectSort 选择排序算法详解
- JavaScript数据结构——队列的实现
- 常用Java开发工具介绍
- JAVA中常见的阻塞队列详解
- Java线上CPU100% 问题排查
- JavaScript,如何在字符串中找到一个字符?
- 支付宝app支付服务端的实现-Java版
- 电脑卡顿严重,更换硬盘或内存条是最后选择,可使用这种方法解决
