首页 > 系统相关 >JNI-记录一个内存泄露的问题

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

时间:2023-05-29 14:34:44浏览次数:50  
标签:disposed will broken 内存 JNI 泄露 unrecoverably channel

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 工具,如果在停止播放后,内存仍然在增长,就要注意了...

标签:disposed,will,broken,内存,JNI,泄露,unrecoverably,channel
From: https://www.cnblogs.com/yongdaimi/p/17440326.html

相关文章

  • JVM运行时的数据区 (内存溢出实例)
    一、概述运行时数据区是jvm运行时的内存布局,类装载到内存后存放的位置,为执行引擎提供所需指令和数据。运行时数据区包括:堆、栈、方法区、本地方法栈、pc计数器。接下来会详细介绍各个部分,并介绍直接内存访问和方法区中的常量池,另外对于每个区域可能发生的内存异常用demo做讲解。二......
  • Java内存溢出和内存泄露
    一、为什么要了解内存泄露和内存溢出? 1、内存泄露一般是代码设计存在缺陷导致的,通过了解内存泄露的场景,可以避免不必要的内存溢出和提高自己的代码编写水平;2、通过了解内存溢出的几种常见情况,可以在出现内存溢出的时候快速的定位问题的位置,缩短解决故障的时间。 二、基本概念 内......
  • Java 内存模型及GC原理
    一个优秀Java程序员,必须了解Java内存模型、GC工作原理,以及如何优化GC的性能、与GC进行有限的交互,有一些应用程序对性能要求较高,例如嵌入式系统、实时系统等,只有全面提升内存的管理效率,才能提高整个应用程序的性能。本文将从JVM内存模型、GC工作原理,以及GC的几个关键问题进行探讨,从G......
  • java内存溢出监控
    在程序内增加内存溢出字符串 使用命令启动jar  -XX:+HeapDumpOnOutOfMemoryError这个命令会在报内存溢出的时候生成 .hprof文件(1)java-XX:+HeapDumpOnOutOfMemoryError-jarzxhs.jar(2)java-Xms128m-Xmx256m-XX:+HeapDumpOnOutOfMemoryError-jarzxhs.jar下......
  • 【cplusplus教程翻译】动态内存
    定义变量使用的内存在程序运行前就确定了,有些时候我们希望能在运行期得到内存,可以使用操作符new和deletenew和new[]new操作符可以分配动态内存,new后面需要跟着数据类型,如果需要多个该数据类型的元素,还需加上方括号,这个操作符返回的是新分配内存的头指针,语法是pointer=newtype......
  • Disruptor内存消息队列简单使用
    Disruptor内存消息队列最近在做一个有关使用内存消息队列到功能,比如将日志信息或点击统计信息持久化等操作,开始想着用java到内存队列作为缓冲区,后来在网上搜到Disruptor这个东西,神乎其神到,就简单了解了一下,做了一个demo,感觉还不错,可以用用,有关概念可以自行搜索,下面就简单介绍一下开......
  • 内存管理机制
    Python使用自动内存管理机制,具体来说是使用垃圾回收(GarbageCollection)来管理内存。Python中的垃圾回收器负责跟踪不再使用的对象,并在适当的时候释放它们所占用的内存。Python的内存管理机制主要基于引用计数(ReferenceCounting)和循环垃圾收集(CycleGarbageCollection)。引用......
  • 驱动开发:内核解析内存四级页表
    当今操作系统普遍采用64位架构,CPU最大寻址能力虽然达到了64位,但其实仅仅只是用到了48位进行寻址,其内存管理采用了9-9-9-9-12的分页模式,9-9-9-9-12分页表示物理地址拥有四级页表,微软将这四级依次命名为PXE、PPE、PDE、PTE这四项。关于内存管理和分页模式,不同的操作系统和体系结构......
  • ThreadLocal是否存在内存泄漏问题,如何防止内存泄漏
    ThreadLocal还是不能百分百地让程序员避免内存泄露,如果程序员不谨慎就很可能导致内存泄露?那么今天我们就来聊聊什么样的情况ThreadLocal不会出现内存泄露?什么样的情况会出现内存泄露?我们如何防止内存泄露的情况发生呢?我们这节就会为同学们一一详细解答,那我们先来简单回忆一下Thr......
  • 深入理解 Java 虚拟机 —— Java 内存模型与线程
    处理器的效率和一致性(与java内存访问可类比)计算机同时去做几件事情,不仅是因为计算机的运算能力强大了,还有一个很重要的原因是计算机的运算速度与它的存储和通信子系统的速度差距太大,大量的时间都花费在磁盘I/O、网络通信或者数据库访问上。如果不希望处理器在大部分时间里都处......