JNI-记录一个内存泄露的问题

发布时间 2023-05-29 14:27:21作者: 夜行过客

android: channel is unrecoverably broken and will be disposed

记录一个关于内存泄漏的问题:

RT, 在停止播放音乐时,每过一段时间就会报

    05-25 10:52:21.125 491-528/system_process E/InputDispatcher: channel '4a8b59f4 activity.MainActivity (server)' ~ Channel is unrecoverably broken and will be disposed!
    05-25 10:52:21.125 491-528/system_process E/InputDispatcher: channel '4a9790c4 activity.ShoppingCartActivity (server)' ~ Channel is unrecoverably broken and will be disposed!

大概是在停止播放后的 10s 后左右,看log, 就这一条信息,别的什么都没有了,

后来发现问题出现在这里:

void PureToneGenerator::Main()
{
    while (!is_exit_)
    {
        AudioData *pData = GenTone();
        NotifyObservers(pData);
    }
    ALOGW("stop gen tone");
}

停止播放后,这个while 循环仍然有在执行,其中的GenTone函数仍然会构造新的 AudioData对象,导致了内存被撑爆了。

另外发现有一个很好的工具可以验证是否是由于内存泄漏导致的:

image-20230529142351155

利用 android studio 自带的 Profilter 工具,如果在停止播放后,内存仍然在增长,就要注意了...