我们生产环境,总是有 JAVA 线程莫名其妙的消失,有没有什么软件可以看到 JVM 什么时候把这些线程回收了?或者可以找到证据来证明这个线程确实是被 JVM 回收了? 我们从日志上看,这个线程肯定是运行一半被回收了,但是找不到证据。各位大神怎么找证据?
我们生产环境,总是有 JAVA 线程莫名其妙的消失,有没有什么软件可以看到 JVM 什么时候把这些线程回收了?或者可以找到证据来证明这个线程确实是被 JVM 回收了? 我们从日志上看,这个线程肯定是运行一半被回收了,但是找不到证据。各位大神怎么找证据?
|
wysnylcJan 17, 2020
1
抛异常了而且你们捕获了但是没打印栈吧
|
|
chendyJan 17, 2020
2
线程不会无缘无故地消失,要么出异常了要么跑完了
目测是异常处理不当丢信息了… |
|
awfeJan 17, 2020
3
有异常了吧
|
|
yumenaweiJan 17, 2020
4
我猜你们是用的默认的线程池,然后线程莫名没了。
|
|
matepiJan 17, 2020
5
刚好我的帖里谈到的。没有 catch Throwable,只 catch Exception 了?
https://www.v2ex.com/t/638609 |
|
Raymon111111Jan 17, 2020
6
全局 try catch
|
|
palmersJan 17, 2020
7
给自己的线程定义名称 然后再排查 楼上说的异常信息吃掉 也检查一下 不然我认为没有办法定位
|
|
guyeuJan 17, 2020
8
不要 catch throwable,全局设置一个默认的异常回调
```java Thread.setDefaultUncaughtExceptionHandler((thread, throwable) -> {...}); ``` |
|
cheng6563Jan 17, 2020 via Android
9
另外,如果出现 oom 错误被捕获了,错误处理里的代码又出现 oom,处理不当是可能线程挂掉又没有日志的。建议启动参数时配置当 oom 时报错并直接干掉整个进程。
|
|
btnokamiJan 18, 2020
10
找个 Profiler 或者查查 thread dump 吧
|
|
gaiusJan 18, 2020 via Android
12
run 里面直接包 try catch,可以参考线程池 runWorker 里面是怎么写的
|
|
alexgorJan 19, 2020 via Android
14
笑死
|