一、起因
公司产品在做高低温试验的时候发现只要高温超过85度,打开音乐播放器的音乐图谱就会出现ANR崩溃。
二、ANR日志分析
要能看懂anr日志,首先要知道以下信息:
-
这是我发生anr的app和时间
这个可以配合导出的logcat时间点配合分析。
-
anr中涉及到的java线程中的6中状态:
状态 | 翻译 | 解释 |
---|---|---|
NEW | 初始 | 新创建了一个线程对象,但还没有调用start()方法 |
RUNNABLE | 运行 | Java线程中将就绪(ready)和运行中(running)两种状态笼统的称为“运行”。线程对象创建后,其他线程(比如main线程)调用了该对象的start()方法。该状态的线程位于可运行线程池中,等待被线程调度选中,获取CPU的使用权,此时处于就绪状态(ready)。就绪状态的线程在获得CPU时间片后变为运行中状态(running)。 |
BLOCKED | 阻塞 | 表示线程阻塞于锁。 |
WAITING | 等待 | 进入该状态的线程需要等待其他线程做出一些特定动作(通知或中断)。 |
TIMED_WAITING | 超时等待 | 该状态不同于WAITING,它可以在指定的时间后自行返回。 |
TERMINATED | 终止 | 表示该线程已经执行完毕。 |
那我们找到主线程main
堆栈状态为RUNNABLE的:
suspend all histogram: Sum: 56.798s 99% C.I. 2.637us-2339.669us Avg: 94.067us Max: 18093us
DALVIK THREADS (48):
"main" prio=5 tid=1 Runnable
| group="main" sCount=0 dsCount=0 flags=0 obj=0x725a43c8 self=0xf8ed53c03c00
| sysTid=3615 nice=-10 cgrp=default sched=0/0 handle=0xf8ed5515ded0
| state=R schedstat=( 44641241731518 3758183587013 42430434 ) utm=4179293 stm=284831 core=3 HZ=100
| stack=0xffffe44ea000-0xffffe44ec000 stackSize=8192KB
| held mutexes= "mutator lock"(shared held)
at com.tyw.media.widget.music.Utils.calcPoint(Utils.java:213)
at com.tyw.media.widget.music.WaveRingView.setWaveData(WaveRingView.java:271)
at com.tyw.media.widget.music.VisualizerHelper.dispose(VisualizerHelper.java:76)
at com.tyw.media.widget.music.VisualizerHelper.access$000(VisualizerHelper.java:11)
at com.tyw.media.widget.music.VisualizerHelper$1.onFftDataCapture(VisualizerHelper.java:37)
at android.media.audiofx.Visualizer$NativeEventHandler.handleCaptureMessage(Visualizer.java:693)
at android.media.audiofx.Visualizer$NativeEventHandler.handleMessage(Visualizer.java:721)
at android.os.Handler.dispatchMessage(Handler.java:107)
at android.os.Looper.loop(Looper.java:214)
at android.app.ActivityThread.main(ActivityThread.java:7407)
at java.lang.reflect.Method.invoke(Native method)
at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:492)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1030)
其中这行at com.tyw.media.widget.music.Utils.calcPoint(Utils.java:213)
是关建行,耗时操作造成了ANR.
三、其他参数说明
Total number of allocations 476778 //进程创建到现在一共创建了多少对象
Total bytes allocated 52MB //进程创建到现在一共申请了多少内存
Total bytes freed 52MB //进程创建到现在一共释放了多少内存
Free memory 777KB //不扩展堆的情况下可用的内存
Free memory until GC 777KB //GC前的可用内存
Free memory until OOME 383MB //OOM之前的可用内存
Total memory 28MB//当前总内存(已用+可用)
Max memory 384MB //进程最多能申请的内存
疑问
为什么有状态为native的?
因为这个日志是cpp打印的,他的状态和java是不一样的。参考其他大神截图: