1

アプリケーションの問題をデバッグしようとしていました。問題の可能性は、スレッドがどこかでハングした可能性があることだけです (ただし、待機中のはずです)。

コマンドライン: com.test.myapp

DALVIK スレッド: (ミューテックス: tll=0 tsl=0 tscl=0 ghl=0) . . .

"pool-2-thread-1" prio=10 tid=20 WAIT
  | group="main" sCount=1 dsCount=0 obj=0x426986e0 self=0x5ae85520
  | sysTid=3211 nice=-8 sched=0/0 cgrp=apps handle=1520669672
  | state=S schedstat=( 9170292 19258957 35 ) utm=0 stm=0 core=0
  at java.lang.Object.wait(Native Method)
  - waiting on <0x4268ed88> (a java.lang.VMThread) held by tid=20 (pool-2-thread-1)
  at java.lang.Thread.parkFor(Thread.java:1231)
  at sun.misc.Unsafe.park(Unsafe.java:323)
  at java.util.concurrent.locks.LockSupport.park(LockSupport.java:159)
  at java.util.concurrent.locks.AbstractQueuedSynchronizer$ConditionObject.await(AbstractQueuedSynchronizer.java:2019)
  at java.util.concurrent.ScheduledThreadPoolExecutor$DelayedWorkQueue.take(ScheduledThreadPoolExecutor.java:1052)
  at java.util.concurrent.ScheduledThreadPoolExecutor$DelayedWorkQueue.take(ScheduledThreadPoolExecutor.java:780)
  at java.util.concurrent.ThreadPoolExecutor.getTask(ThreadPoolExecutor.java:1013)
  at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1073)
  at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:573)

上記の行は、疑わしいスレッドを指しています。ダンプ状態ログでの DALVIK THREADS の意味は何ですか? それは現在生きているスレッドですか、それとも生きているスレッド + 生きていたスレッドですか? state=S schedstat=( 9170292 19258957 35 ) utm=0 stm=0 core=0 とはどういう意味ですか?サスペンド状態ですか? <0x4268ed88> (java.lang.VMThread) を待機中 --> これはどういう意味ですか? それは待っていて生きていますか?

4

1 に答える 1

1

ログに基づいて、ANR をトリガーしたと考えられる唯一の理由は次のとおりです。

私の知る限り、通常、Java ではすべてのスレッドが 2 つのコンポーネントに関連付けられています。1 つはプログラム カウンターで、もう 1 つはガベージ コレクターです。したがって、すべてのスレッドで gc モニターが発生します。

- tid=20 が保持する<0x4268ed88> (java.lang.VMThread) を待機中(poo)

VMThreads は、gc の監視のこの側面をほぼ並行して処理するために理想的に使用されます。だから私が考えることができるのは、あなたのシナリオでは、あなたのアプリのいくつかのコンポーネントがロックを取得しようとしているが、VMThread がロックを保持していて、まだ解放されていないため (主要な GC op が原因である可能性があります)、vmthread を待っていることです。ロックを解除します。

gc アクティビティがログに記録されているメインのログ ダンプを確認すると、gc がこのスレッドの CPU 時間を大量に消費している理由をよりよく把握でき、アプリのプロファイリングが役立つ場合があります。ちょっとチェック。

于 2013-08-22T11:05:47.830 に答える