今日工作总结:
感觉之前的工作总结说的方法论越来越多,争取未来多说一些技术细节。
今天解决了两个问题,先说第一个:某个同学遇到一个java守护线程跑着跑着突然没日志了的问题。
遇到这类问题的解决思路很简单,守护线程的实现是个死循环,跑着跑着突然日志没了,要么是线程卡住了,要么线程没了。
所以先用jstack,看看线程是否还在,发现线程不见了。
查看代码,线程的循环里用了try..catch(Exception),在使用了try..catch的情况下线程崩溃,大部分都是因为抛出了Error,而不是Exception。
在java中,所有异常都继承自Throwable,但是从Throwable派生出了Exception 和Error,逻辑类的异常(比如NPE)继承自Exception,类加载错误、OOM都继承自Error。
因为这个问题可复现,所以很轻松的就复现出线程里的代码执行时由于类初始化失败,抛出了NoClassDefFoundError。最后发现是因为依赖冲突,A类在初始化时需要初始化B类,但是B类不存在,抛出Error,最终线程退出。
因为这类对于新人来说比较隐蔽,但是对于高龄程序员来说基本上是日常便饭,让我逮到机会狠狠的装了一回。
感觉之前的工作总结说的方法论越来越多,争取未来多说一些技术细节。
今天解决了两个问题,先说第一个:某个同学遇到一个java守护线程跑着跑着突然没日志了的问题。
遇到这类问题的解决思路很简单,守护线程的实现是个死循环,跑着跑着突然日志没了,要么是线程卡住了,要么线程没了。
所以先用jstack,看看线程是否还在,发现线程不见了。
查看代码,线程的循环里用了try..catch(Exception),在使用了try..catch的情况下线程崩溃,大部分都是因为抛出了Error,而不是Exception。
在java中,所有异常都继承自Throwable,但是从Throwable派生出了Exception 和Error,逻辑类的异常(比如NPE)继承自Exception,类加载错误、OOM都继承自Error。
因为这个问题可复现,所以很轻松的就复现出线程里的代码执行时由于类初始化失败,抛出了NoClassDefFoundError。最后发现是因为依赖冲突,A类在初始化时需要初始化B类,但是B类不存在,抛出Error,最终线程退出。
因为这类对于新人来说比较隐蔽,但是对于高龄程序员来说基本上是日常便饭,让我逮到机会狠狠的装了一回。