WebSphere Web 容器线程挂起,最大线程状态为可运行

WebSphere web container threads hungs with maximum threads state in runnable

我们有包含 2 个节点代理和 4 个应用程序服务器的 WebSphere 环境。在高流量情况下,其中一台应用程序服务器在跳转到最大 Web 容器线程数时停止响应请求。
在分析线程转储时,我们发现大约 60% 的线程处于可运行状态,其中 20% 的线程处于等待和停放状态。
我们在线程转储中没有看到任何死锁警告。 仔细观察,我们发现其中一个 Web 容器线程拥有锁,并显示以下消息:

Owns Monitor Lock on com/ibm/ws/classloader/ExtJarClassLoader@0x0A00000000FA6F30

有人可以帮助理解上述错误及其解决方案吗?

重要的是查看拥有锁的线程的堆栈跟踪,然后查看等待该锁的所有其他线程的堆栈跟踪。对于 ExtJarClassLoader,这几乎肯定意味着所有线程都在尝试执行 loadClass 操作。如果许多线程正在尝试此操作并被阻止,那么这通常意味着 运行 代码正在尝试 failing loadClass 操作,捕获 ClassNotFoundException,然后继续。创建和抛出 ClassNotFoundException 的代价很高,因此通常应修改代码以缓存整体结果(例如,如果它正在尝试一系列 class 加载,则应以某种方式缓存 positive/negative 结果)。如果调用 loadClass 的代码是第三方库,这当然会很复杂。