12-28 18:27:18.948 812 884 E LinJwDemoMqtt: publish failed : 等待来自服务器的响应时超时 (32000) 12-28 18:27:18.948 812 884 E LinJwDemoMqtt: at d.c.a.a.a.l(Unknown Source:9) 12-28 18:27:18.948 812 884 E LinJwDemoMqtt: at g.b.a.a.a.l.b.a(:4) 12-28 18:27:18.948 812 884 E LinJwDemoMqtt: at g.b.a.a.a.k$b.run(:8) 12-28 18:27:18.948 812 884 E LinJwDemoMqtt: at java.util.TimerThread.mainLoop(Timer.java:562) 12-28 18:27:18.948 812 884 E LinJwDemoMqtt: at java.util.TimerThread.run(Timer.java:512)
Long monitor contention with owner MQTT Call: LinJwDemoMqtt_1672223154916 (1252) at void java.lang.Thread.sleep(java.lang.Object, long, int)(Thread.java:-2) waiters=0 in java.util.List d.d.e.c.k.b.f.f(java.lang.String, java.lang.String) for 270.749s
... } else if (wait_ms > kLongWaitMs && owners_method != nullptr) { uint32_t pc; ArtMethod* m = self->GetCurrentMethod(&pc); // TODO: We should maybe check that original_owner is still a live thread. LOG(WARNING) << "Long " << PrettyContentionInfo(original_owner_name, original_owner_tid, owners_method, owners_dex_pc, num_waiters) << " in " << ArtMethod::PrettyMethod(m) << " for " << PrettyDuration(MsToNs(wait_ms)); } ...
Long monitor contention with owner TestLongMonitor1 (3457) at void me.linjw.demo.MainActivity.sleep1()(MainActivity.java:41) waiters=0 in void me.linjw.demo.MainActivity.sleep2() for 1s
所以当我们看到这个打印的时候就应该去检查下是否在上锁的代码块里面做了耗时操作。
kill -3 命令
再来看看这个日志:
1
Long monitor contention with owner MQTT Call: LinJwDemoMqtt_1672223154916 (1252) at void java.lang.Thread.sleep(java.lang.Object, long, int)(Thread.java:-2) waiters=0 in java.util.List d.d.e.c.k.b.f.f(java.lang.String, java.lang.String) for 270.749s
"MQTT Call: LinJwDemoMqtt_1672223154916" prio=5 tid=21 Sleeping | group="main" sCount=1 dsCount=0 flags=1 obj=0x132c06f0 self=0x7d42a40800 | sysTid=1561 nice=0 cgrp=default sched=0/0 handle=0x7d329144f0 | state=S schedstat=( 2172565480 1496095545 17833 ) utm=151 stm=64 core=5 HZ=100 | stack=0x7d32811000-0x7d32813000 stackSize=1041KB | held mutexes= at java.lang.Thread.sleep(Native method) - sleeping on <0x07054ef1> (a java.lang.Object) at java.lang.Thread.sleep(Thread.java:373) - locked <0x07054ef1> (a java.lang.Object) at java.lang.Thread.sleep(Thread.java:314) at android.net.LocalSocketImpl$SocketOutputStream.flush(LocalSocketImpl.java:185) at d.d.e.b.c.b.a(:2) at d.d.e.c.k.b.f.g(:-1) at d.d.e.c.k.b.f.f(:-1) - locked <0x0ab63ad6> (a d.d.e.c.k.b.f) at d.d.e.c.k.b.e.a(:-1) at d.d.e.c.k.a.a(:2) at d.d.e.c.j.d$a.a(:3) at d.d.e.c.h.e$a.a(:30) at g.b.a.a.a.l.c.d(:12) at g.b.a.a.a.l.c.run(:-1) at java.lang.Thread.run(Thread.java:764)
12-28 18:30:59.832 1852 2770 W System : A resource failed to call response.body().close().
线程锁定位
从上面我们只能看到其中的一个线程被localsocket堵住了,但是为什么mqtt会不断断开呢,我们从堆栈里面看到这个线程锁了一个0x0ab63ad6对象,在堆栈里搜索它,可以看到后面新启动的mqtt线程都在”waiting to lock <0x0ab63ad6> (a d.d.e.c.k.b.f) held by thread 21”:
"MQTT Call: LinJwDemoMqtt_1672223188697" prio=5 tid=41 Blocked | group="main" sCount=1 dsCount=0 flags=1 obj=0x13780ef8 self=0x7d42a3fc00 | sysTid=4307 nice=0 cgrp=default sched=0/0 handle=0x7d30f194f0 | state=S schedstat=( 9329835 2060251 4 ) utm=0 stm=0 core=2 HZ=100 | stack=0x7d30e16000-0x7d30e18000 stackSize=1041KB | held mutexes= at d.d.e.c.k.b.f.f(:-1) - waiting to lock <0x0ab63ad6> (a d.d.e.c.k.b.f) held by thread 21 at d.d.e.c.k.b.e.a(:-1) at d.d.e.c.k.a.a(:2) at d.d.e.c.a.a(:3) at d.d.e.c.j.d.a(:24) at d.d.e.c.j.b.a(:1) at d.d.e.c.h.e$a.a(:11) at g.b.a.a.a.l.c.d(:12) at g.b.a.a.a.l.c.run(:-1) at java.lang.Thread.run(Thread.java:764)
"MQTT Call: LinJwDemoMqtt_1672223201187" prio=5 tid=42 Blocked | group="main" sCount=1 dsCount=0 flags=1 obj=0x131c10b8 self=0x7d44472000 | sysTid=4730 nice=0 cgrp=default sched=0/0 handle=0x7d30e134f0 | state=S schedstat=( 23179915 15908085 274 ) utm=1 stm=0 core=3 HZ=100 | stack=0x7d30d10000-0x7d30d12000 stackSize=1041KB | held mutexes= at d.d.e.c.k.b.f.f(:-1) - waiting to lock <0x0ab63ad6> (a d.d.e.c.k.b.f) held by thread 21 at d.d.e.c.k.b.e.a(:-1) at d.d.e.c.k.a.a(:2) at d.d.e.c.a.a(:3) at d.d.e.c.j.d.a(:24) at d.d.e.c.j.b.a(:1) at d.d.e.c.h.e$a.a(:11) at g.b.a.a.a.l.c.d(:12) at g.b.a.a.a.l.c.run(:-1) at java.lang.Thread.run(Thread.java:764)
"MQTT Call: LinJwDemoMqtt_1672223216180" prio=5 tid=43 Blocked | group="main" sCount=1 dsCount=0 flags=1 obj=0x13782748 self=0x7d44472c00 | sysTid=4945 nice=0 cgrp=default sched=0/0 handle=0x7d30d0d4f0 | state=S schedstat=( 9939123 3184420 14 ) utm=0 stm=0 core=3 HZ=100 | stack=0x7d30c0a000-0x7d30c0c000 stackSize=1041KB | held mutexes= at d.d.e.c.k.b.f.f(:-1) - waiting to lock <0x0ab63ad6> (a d.d.e.c.k.b.f) held by thread 21 at d.d.e.c.k.b.e.a(:-1) at d.d.e.c.k.a.a(:2) at d.d.e.c.a.a(:3) at d.d.e.c.j.d.a(:24) at d.d.e.c.j.b.a(:1) at d.d.e.c.h.e$a.a(:11) at g.b.a.a.a.l.c.d(:12) at g.b.a.a.a.l.c.run(:-1) at java.lang.Thread.run(Thread.java:764) ...