WebSphere Web容器线程在runnable中挂起最大线程状态

时间:2016-07-20 07:41:34

标签: java websphere websphere-8 web-container ibm-jdk

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

server
{
        listen 80;
        server_name code.example.com;

        charset utf-8;

        location /
        {
                proxy_read_timeout 300;
                proxy_connect_timeout 300;
                proxy_redirect off;

                proxy_set_header X-Forwarded-Proto $scheme;
                proxy_set_header Host $http_host;
                proxy_set_header X-Real-IP $remote_addr;
                proxy_set_header X-Forwarded-Ssl on;
                proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
                proxy_set_header X-Forwarded-Proto $scheme;

                proxy_pass http://127.0.0.1:3000;
        }

        server_tokens off;
}

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

1 个答案:

答案 0 :(得分:1)

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