Java 线程会莫名其妙的消失

2020-01-17 16:23:53 +08:00
 burnbrid

我们生产环境,总是有 JAVA 线程莫名其妙的消失,有没有什么软件可以看到 JVM 什么时候把这些线程回收了?或者可以找到证据来证明这个线程确实是被 JVM 回收了? 我们从日志上看,这个线程肯定是运行一半被回收了,但是找不到证据。各位大神怎么找证据?

4819 次点击
所在节点    程序员
14 条回复
wysnylc
2020-01-17 16:32:01 +08:00
抛异常了而且你们捕获了但是没打印栈吧
chendy
2020-01-17 16:36:18 +08:00
线程不会无缘无故地消失,要么出异常了要么跑完了
目测是异常处理不当丢信息了…
awfe
2020-01-17 16:36:18 +08:00
有异常了吧
yumenawei
2020-01-17 16:37:54 +08:00
我猜你们是用的默认的线程池,然后线程莫名没了。
matepi
2020-01-17 16:39:18 +08:00
刚好我的帖里谈到的。没有 catch Throwable,只 catch Exception 了?
https://www.v2ex.com/t/638609
Raymon111111
2020-01-17 17:52:54 +08:00
全局 try catch
palmers
2020-01-17 18:13:33 +08:00
给自己的线程定义名称 然后再排查 楼上说的异常信息吃掉 也检查一下 不然我认为没有办法定位
guyeu
2020-01-17 18:35:18 +08:00
不要 catch throwable,全局设置一个默认的异常回调
```java
Thread.setDefaultUncaughtExceptionHandler((thread, throwable) -> {...});
```
cheng6563
2020-01-17 20:43:17 +08:00
另外,如果出现 oom 错误被捕获了,错误处理里的代码又出现 oom,处理不当是可能线程挂掉又没有日志的。建议启动参数时配置当 oom 时报错并直接干掉整个进程。
btnokami
2020-01-18 06:42:38 +08:00
找个 Profiler 或者查查 thread dump 吧
zhaorunze
2020-01-18 11:48:48 +08:00
@matepi Error 不 catch 日志不会打印吗?
gaius
2020-01-18 12:40:28 +08:00
run 里面直接包 try catch,可以参考线程池 runWorker 里面是怎么写的
matepi
2020-01-18 12:58:13 +08:00
@zhaorunze syserr 有配 logger 的话会有,但很多的 logger 配法都会把默认 out 和 err 丢掉。
alexgor
2020-01-19 04:34:09 +08:00
笑死

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/638786

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX