android – 解释Logcat条目:threadid = 8:撤消后仍然挂起(sc = 1 dc = 1 s = Y)

前端之家收集整理的这篇文章主要介绍了android – 解释Logcat条目:threadid = 8:撤消后仍然挂起(sc = 1 dc = 1 s = Y)前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
我的应用程序启动后,我正在运行十个AsyncTasks.有时,模拟器需要很长时间才能启动这些任务.发生这种情况时,我在log cat中看到以下消息:

D / dalvikvm(1983):threadid = 8:撤消后仍然暂停(sc = 1 dc = 1 s = Y)

当模拟器快速执行时,不会出现此消息.奇怪的是,这种行为今天没有任何修改就改变了.由于我已经向模拟器明确分配了512mb ram,它不再是非常慢~5min,现在~5s.在真实设备上,我从来没有执行过慢.

我想了解这个日志cat消息的含义.我知道具有指定id的线程在此状态下被挂起并且无法正常工作.但为什么?什么撤消? (sc = 1 dc = 1 s = Y)是什么意思?

解决方法

@H_301_11@ 消息来自dvmSuspendSelf(),当调试器(通过JDWP线程)要求它们挂起时,线程调用.

它应该工作的方式是(“我们”是一个线程):

> JDWP要求我们暂停
>我们告诉它我们已经暂停并进入睡眠状态
>最终,调试器唤醒了我们,我们恢复了

当VM正在等待信号的条件变量时,将记录该消息,但由于某种原因,我们仍然标记为已暂停.代码说明:

/*
 * The condition was signaled but we're still suspended.  This
 * can happen if the debugger lets go while a SIGQUIT thread
 * dump event is pending (assuming SignalCatcher was resumed for
 * just long enough to try to grab the thread-suspend lock).
 */

在这种情况下的期望是当信号到达时我们意外地被唤醒(例如,system_server认为有一个ANR,因为主线程没有响应,因为调试器已经暂停它),如果我们再次循环,调试器将得到一个有机会清理我们并让我们继续前进.

日志消息正在打印self-> suspendCount的值(我们被告知要暂停多少次),self-> dbgSuspendCount(这些挂起请求中有多少来自调试器,因此我们可以“撤消”所有那些如果调试器断开连接),以及self-> isSuspended布尔值.

请注意,“s = Y”标志在姜饼中消失了 – 线程悬挂的工作方式是changed.

猜你在找的Android相关文章