`
chenjingbo
  • 浏览: 456437 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
社区版块
存档分类
最新评论

Idea关闭JBoss造成死锁的问题

 
阅读更多

之前使用Idea,如果启动JBoss异常,然后点击关闭JBoss,就会造成整个Idea挂了.只有通过任务管理器关闭对应的idea和java进程才行.今天终于得空,来解决这个问题.

造成启动JBoss,终于出现异常,然后点关闭,出现死锁.果断使用visualvm查看.(很奇怪的是 jconsole检测不到死锁.)

heapdump summary 写道

“JBoss Shutdown Hook” daemon prio=10 tid=0x0000000056fa8000 nid=0×2525 waiting for monitor entry [0x0000000047184000]

java.lang.Thread.State: BLOCKED (on object monitor)

at org.jboss.web.AbstractWebContainer.stop(AbstractWebContainer.java:494)

死锁的问题出现.然后直接google,发现网上有一篇介绍,原因是

 

http://rdc.taobao.com/team/jm/archives/1256 写道
这里涉及到两个线程,主线程main和JBOSS的shutdown hook线程。

main线程在部署应用时,首先会获得org.jboss.web.tomcat.service.JBossWeb类的对象的锁,在获得锁后,遇到System.exit()调用,JVM会在System.exit()中调用所有注册过的shutdown hook,其中也包括JBOSS的shutdown hook,main线程会等待所有的shutdown hook执行完毕后,再恢复自身的执行,关闭虚拟机。

JBOSS的shutdown hook的行为是关闭JBOSS,在关闭之前先卸载所有部署于JBOSS的应用,卸载应用时又会尝试获取org.jboss.web.tomcat.service.JBossWeb类的对象的锁,但这个锁被main线程占有,没有释放,导致JBOSS的shutdown hook线程挂起。

此时的状态是,main线程等待shutdown hook执行完毕,shutdown hook等待main线程占有的锁,产生死锁。


基本确定问题,开始找解决的办法..直接查看对应的线程堆栈,看看哪里调用了system.exit.

查看后发现..

写道
Local Variable: java.lang.Shutdown$Lock#2
at java.lang.Shutdown.exit(Shutdown.java:212)
at java.lang.Runtime.exit(Runtime.java:107)
Local Variable: java.lang.Runtime#1
at java.lang.System.exit (System.java:960)
at com.taobao.session.config.ConfigServerXmlConfig.fetchConfigsFromData (ConfigServerXmlConfig.java:84)
Local Variable: com.taobao.session.IllegalConfigException#1
at com.taobao.session.config.ConfigServerXmlConfig.access$000(ConfigServerXmlConfig.java:18)
at com.taobao.session.config.ConfigServerXmlConfig$1.receiveConfigInfo(ConfigServerXmlConfig.java:32)
at com.taobao.session.config.AbstractConfigServerConfig.waitFor(AbstractConfigServerConfig.java:146)
Local Variable: com.taobao.session.config.ConfigServerXmlConfig$1#1

查看对应的类,果然

 } catch (Exception e) {
            diamondLog.error("receive wrong sessionConfig and discard:" + configInfo,e);
            if (initialized.get()) {
            	diamondLog.error("receive wrong sessionConfig and discard it", e);
                return;
            } else {
            	diamondLog.error("receive wrong sessionConfig and webServer halt", e);
                System.exit(0);




            }
        }

差不多就是session init的时候出错了. 同事雷文根据我的IP在后台帮忙看了对应的出错日志.


可以看到是对应的group传错了.

 <filter>
        <filter-name>sessionFilter</filter-name>
        <filter-class>com.taobao.session.TaobaoSessionFilter</filter-class>
        <init-param>
            <param-name>tbsessionConfigGroup</param-name>
            <param-value>${tbsession.configserver.group}</param-value>
        </init-param> 
        <init-param>
            <param-name>isloginSessionCheck</param-name>  
            <param-value>true</param-value>
        </init-param>
        <init-param>
            <param-name>traceEnabled</param-name>
            <param-value>false</param-value>
        </init-param>
    </filter>

到这里基本就明确了,重新package..重启,问题解决.

 

但是每次重启idear都会重新update一次.所以又把没有替换的代码copy到对应的目录,对于这个问题.解决方法是关闭启动的时候的make.如下

 


 

 

最后,万分感谢雷文童鞋的帮助

  • 大小: 19.5 KB
  • 大小: 60.4 KB
分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics