如何查找导致 JVM 瘫痪的 ReentrantLock 中的许多 IllegalMonitorStateException 的原因?

问题描述 投票:0回答:1

我们在 Java 11 上有一个繁忙的 Spring Boot 应用程序,运行时间从几分钟到几个小时不等,然后用以下内容向日志发送垃圾邮件:

2024-04-08 12:54:08.079 Exception in thread "redisson-3-11" java.lang.IllegalMonitorStateException
2024-04-08 12:54:08.079 at java.base/java.util.concurrent.locks.ReentrantLock$Sync.tryRelease(ReentrantLock.java:149)
2024-04-08 12:54:08.079 at java.base/java.util.concurrent.locks.AbstractQueuedSynchronizer.release(AbstractQueuedSynchronizer.java:1302)
2024-04-08 12:54:08.079 at java.base/java.util.concurrent.locks.ReentrantLock.unlock(ReentrantLock.java:439)
2024-04-08 12:54:08.079 at java.base/java.util.concurrent.LinkedBlockingQueue.take(LinkedBlockingQueue.java:440)
2024-04-08 12:54:08.079 at java.base/java.util.concurrent.ThreadPoolExecutor.getTask(ThreadPoolExecutor.java:1054)
2024-04-08 12:54:08.079 at java.base/java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1114)
2024-04-08 12:54:08.079 at java.base/java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:628)
2024-04-08 12:54:08.079 at io.netty.util.concurrent.FastThreadLocalRunnable.run(FastThreadLocalRunnable.java:30)
2024-04-08 12:54:08.079 at java.base/java.lang.Thread.run(Thread.java:829)
    

来自许多不同的线程,都具有相同的堆栈跟踪:

2024-04-08 12:54:08.079 Exception in thread "redisson-3-11" java.lang.IllegalMonitorStateException
2024-04-08 12:54:54.680 Exception in thread "redisson-3-12" java.lang.IllegalMonitorStateException
2024-04-08 12:54:58.202 Exception in thread "http-nio-8209-exec-11" java.lang.IllegalMonitorStateException
2024-04-08 12:55:51.790 Exception in thread "http-nio-8209-exec-89" java.lang.IllegalMonitorStateException
.. many more ..
2024-04-08 13:16:46.576 Exception in thread "redisson-3-15" java.lang.IllegalMonitorStateException
2024-04-08 13:23:14.380 Exception in thread "web-6" java.lang.IllegalMonitorStateException
2024-04-08 13:23:22.065 Exception in thread "HikariPool-1 connection adder" java.lang.IllegalMonitorStateException
2024-04-08 13:23:34.204 Exception in thread "web-8" java.lang.IllegalMonitorStateException

记录的第一个线程有所不同。从现在开始,使用 ReentrantLock 的任何东西似乎都被破坏了。它似乎与内存无关(堆增加,仍然发生,大量可用内存,没有 OOM 异常)。我们已升级到最新的 Java 11 映像 (eclipse-temurin:11.0.22_7-jdk-jammy)。

我们添加了一个 hack 来检测这种情况(@Scheduled 任务停止运行)并退出 JVM 作为解决方法,但这并不理想。大家有什么想法吗?

谢谢

java concurrency jvm
1个回答
0
投票

如果您查看 Javadocs 中的 IlledgalMonitorStateException,它是这样说的:

抛出该异常表示线程已尝试等待对象的 监视或通知在对象监视器上等待的其他线程 不拥有指定的显示器。

因此,如果您看到此情况,则需要检查在哪里使用 wait()、notify() 或 notifyAll() 并确保您首先已在对象上同步。

© www.soinside.com 2019 - 2024. All rights reserved.