Android V 挂起线程超时导致system_server挂掉

问题背景

最近Android v的平台频繁爆monkey异常停止的问题,分析到根因不是频繁dump堆栈导致system_server挂掉就是三方应用进程内部死锁导致anr,然后system_server挂起线程超时,system_server就崩了

解决方案

先来看看anr导致死锁的场景如何分析

从log来看确认为system_server crash导致monkey测试停止:
从堆栈来看为art库里面的问题,但是这只是为Android提供一个运行环境,相当于jvm,细分一点就是管理进/线程环境的库,开始认为这个原生的一般不会有问题(所以作为一名开发就要敢于质疑,推陈出新):

进一步查看问题发生时间点13:17:00之前的log发现有线程挂起失败的打印,binder线程:612_11跟上面system_server crash的日志吻合:

### Java线程挂起与阻塞机制 在Java中,线程挂起(suspending)、阻塞(blocking)以及等待(waiting)是不同的概念,尽管它们都涉及线程暂时停止执行的情况。以下是关于这些机制的具体分析: #### 线程挂起 线程挂起指的是通过某些手段让线程暂停运行,直到显式唤醒它为止。然而,在现代Java开发中,直接挂起线程的操作已经被废弃,主要是因为它容易引发死锁或其他同步问题[^3]。 当一个线程挂起时,它的状态并不会直接影响其他线程的状态或资源分配。也就是说,**单一线程挂起不会自动导致整个程序或其它线程的阻塞**。但是需要注意的是,如果该线程持有某种共享资源(如对象锁),则可能会间接影响依赖此资源的其他线程。 #### 阻塞与等待的区别 - **阻塞(Blocked State)**: 当多个线程试图访问同一时间只能由单一线程使用的资源(比如 synchronized 块中的代码区域)时发生。此时未获得锁的线程会被标记为 blocked 并放入队列中直至轮到自己获取锁。 - **等待(Waiting State)**: 如果当前线程主动放弃 CPU 时间片并进入休眠模式,则称为 waiting state。例如调用 `Thread.sleep()` 或者另一个线程上的 `join(long millis)` 方法都会使本线程进入这种状态[^2]。值得注意的是,处于 waiting 状态下的线程几乎不占用任何处理器周期。 对于题目给出的例子来说,`t1.join(2000)` 表明主线程(main thread) 将会最多停留两秒钟来观察子线程(t1) 是否完成;一旦 t1 提前完成了自己的任务,则 main 不再需要额外延时即可恢复正常运作[^1]。 ```java public class JoinExample { public static void main(String[] args) throws InterruptedException { Thread t1 = new Thread(() -> { for (int i = 0; i < 5; ++i){ System.out.println("T1 running..."); try{Thread.sleep(100);}catch(Exception ex){} } }); t1.start(); long start=System.currentTimeMillis(); // Main waits until T1 finishes or timeout occurs. t1.join(2000); System.out.printf("Total execution time:%d ms\n", System.currentTimeMillis()-start); } } ``` 在这个例子中,即使我们设置了超时时间为2秒(`t1.join(2000)`), 只要`t1`能在少于这规定时间内结束工作, 主函数就会立刻继续往下走. #### 总结 综上所述,虽然单独某条线程因各种原因而陷入 suspended/block/waited 等非活跃阶段确实会对整体应用性能造成一定干扰,但它本身并不足以构成全局性的停滞现象——除非存在不当设计致使关键路径受困于长时间不可响应的组件之上。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值