应用不能正常退出原因排查
来源:互联网 发布:主机公园 php搭建 编辑:程序博客网 时间:2024/05/18 01:53
点真背,上班第一天就遇到个奇怪的问题。
1、现象:
应用执行完毕之后,不能正常退出。
jstack发现多了下面这个非daemon线程。
"pool-1-thread-1" prio=10 tid=0x00007f8131439800 nid=0x2922 waiting on condition [0x00007f804b6a5000] java.lang.Thread.State: TIMED_WAITING (parking) at sun.misc.Unsafe.park(Native Method) - parking to wait for <0x00007f80a1773f08> (a java.util.concurrent.locks.AbstractQueuedSynchronizer$ConditionObject) at java.util.concurrent.locks.LockSupport.parkNanos(LockSupport.java:198) at java.util.concurrent.locks.AbstractQueuedSynchronizer$ConditionObject.awaitNanos(AbstractQueuedSynchronizer.java:2025) at java.util.concurrent.DelayQueue.take(DelayQueue.java:164) at java.util.concurrent.ScheduledThreadPoolExecutor$DelayedWorkQueue.take(ScheduledThreadPoolExecutor.java:583) at java.util.concurrent.ScheduledThreadPoolExecutor$DelayedWorkQueue.take(ScheduledThreadPoolExecutor.java:576) at java.util.concurrent.ThreadPoolExecutor.getTask(ThreadPoolExecutor.java:947) at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:907) at java.lang.Thread.run(Thread.java:619)
2、分析
因为应用的前一版本在线上执行没有问题,线下修改的内容也基本不会造成问题,所以查了一下。
3、过程
真tm坑爹,线程的名字丝毫没有帮助。
开始google的时候,有人说是jdk的bug,也有人说是死锁。结果都不是。
没办法,硬着头皮,一点一点把依赖的jar包降回去。
n次编译之后,发现是某个jar包的问题。出问题的代码类似于这个:
public static void main(String[] args) { ScheduledThreadPoolExecutor executor = new ScheduledThreadPoolExecutor(1); executor.scheduleAtFixedRate(new Runnable() { public void run() { System.out.println(new Date()); } }, 1000L, 1000L, TimeUnit.MILLISECONDS); }
4、解决办法
找到那个jar包的负责人确认了,下个版本发布掉。
5、结论
5.1、线程的名字太飘逸的话,问题真难找。
5.2、点真背,别再让我遇到这样的bug了吧。
5.3、我真有耐心。编译了整个下午!
- 应用不能正常退出原因排查
- COM 应用程序不能正常退出
- 记问题排查:java进程未正常退出
- PeekMessage 导致程序不能正常退出 CPU100%
- MFC工程不能正常退出的解决方法
- iOS 应用安装失败原因排查
- iOS 应用安装失败原因排查
- vim markdown插件不能正常工作问题排查
- validator不能正常使用的原因
- eclipse不明原因不能正常启动
- Hadoop DataNode不能正常工作的原因
- freebsd下面crontab定时任务不能自动执行原因排查
- linux vi E325错误,不能正常编辑退出
- iOS应用通过蒲公英orFIR安装失败原因排查
- ionic应用图标不能正常显示解决办法
- JBuilder不能正常启动的另外一个原因
- FC6 中串口不能正常使用的原因与解决办法
- 计算机程序不能正常运行则调试找原因
- C#中的yield return 和return有什么区别
- Eclipse swing/swt可视化开发工具windowbuilder 搭载
- RTMP协议中的AMF数据
- java中判断字符串是否为数字的三种方法
- jqGrid的使用方法(编辑,删除,更新,新增)
- 应用不能正常退出原因排查
- SD卡分区教程 安卓手机SD卡分区
- rtmp协议简单解析以及用其发送h264的flv文件
- java枚举
- ios 相关代码段
- C#报表开发工具ReportViewer vs Stimulsoft Reports.Net
- struts2.2.3.1版本不兼容问题小记
- 华为总裁任正非管理幽默语录,深入浅出的语言,揭示大道理
- Java基础---第十一天 多线程