0

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

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

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

4

1 回答 1

1

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

于 2016-07-23T15:27:35.887 回答