android - 如何停止如此频繁地运行 GC_CONCURRENT?

标签 android audio audio-recording android-2.3-gingerbread

我正在使用一个线程,该线程使用 AudioRecord 类记录音频并放置在 recorderBUffer(它是 Short[] 的链表)中,一个单独的线程对这些数据进行编码并将其放置到 playerBuffer(链表[]).为了播放音频,我使用 AudioTrack 类和 onPeriodicNotification() 我从 playerBuffer 读取数据并将其写入轨道。

代码看起来简单明了。但是,它没有按应有的方式工作。 GC_CONCURRENT 一直在吃,这导致 AudioTrack 如此频繁地重新启动(我猜!)。我从 LogCat 收到以下消息:-

04-09 12:25:13.757: E/Constructor(10100): inside constructor 
04-09 12:25:13.757: I/ApplicationPackageManager(10100): cscCountry is not German : INS
04-09 12:25:17.429: E/startRecording(10100): start Recording
04-09 12:25:17.445: I/AudioCapturer(10100): Audio Recorder created
04-09 12:25:17.546: I/Audio Player(10100): Audio Track instance created buffer Size : 2972
04-09 12:25:17.546: I/SpeexThread(10100): Thread Started Successfully..
04-09 12:25:17.734: D/dalvikvm(10100): GC_CONCURRENT freed 55K, 44% free 3208K/5639K, external 408K/517K, paused 4ms+6ms
04-09 12:25:17.945: D/dalvikvm(10100): GC_CONCURRENT freed 1K, 39% free 3765K/6151K, external 408K/517K, paused 3ms+8ms
04-09 12:25:18.148: D/dalvikvm(10100): GC_CONCURRENT freed <1K, 36% free 4277K/6663K, external 408K/517K, paused 3ms+8ms
04-09 12:25:18.414: D/dalvikvm(10100): GC_CONCURRENT freed <1K, 33% free 4981K/7367K, external 408K/517K, paused 3ms+9ms
04-09 12:25:18.734: D/dalvikvm(10100): GC_CONCURRENT freed <1K, 29% free 5877K/8263K, external 408K/517K, paused 3ms+9ms
04-09 12:25:18.828: W/AudioTrack(10100): obtainBuffer() track 0x1d0478 disabled, restarting
04-09 12:25:19.164: D/dalvikvm(10100): GC_CONCURRENT freed <1K, 26% free 7093K/9479K, external 408K/517K, paused 3ms+9ms
04-09 12:25:19.710: D/dalvikvm(10100): GC_CONCURRENT freed <1K, 22% free 8693K/11079K, external 408K/517K, paused 3ms+9ms
04-09 12:25:19.984: W/AudioTrack(10100): obtainBuffer() track 0x1d0478 disabled, restarting
04-09 12:25:20.414: D/dalvikvm(10100): GC_CONCURRENT freed <1K, 19% free 10741K/13127K, external 408K/517K, paused 3ms+9ms
04-09 12:25:21.156: W/AudioTrack(10100): obtainBuffer() track 0x1d0478 disabled, restarting
04-09 12:25:21.171: D/dalvikvm(10100): GC_CONCURRENT freed <1K, 16% free 12789K/15175K, external 408K/517K, paused 3ms+11ms
04-09 12:25:21.976: D/dalvikvm(10100): GC_CONCURRENT freed <1K, 14% free 14837K/17223K, external 408K/517K, paused 3ms+9ms
// same messages errors continue  
04-09 12:25:28.117: W/AudioTrack(10100): obtainBuffer() track 0x1d0478 disabled, restarting
04-09 12:25:29.242: D/dalvikvm(10100): GC_CONCURRENT freed 1K, 8% free 29172K/31559K, external 408K/517K, paused 3ms+11ms
04-09 12:25:29.273: W/AudioTrack(10100): obtainBuffer() track 0x1d0478 disabled, restarting
04-09 12:25:30.445: W/AudioTrack(10100): obtainBuffer() track 0x1d0478 disabled, restarting
04-09 12:25:30.507: D/dalvikvm(10100): GC_CONCURRENT freed 1K, 8% free 31220K/33607K, external 408K/517K, paused 4ms+12ms
04-09 12:25:31.601: W/AudioTrack(10100): obtainBuffer() track 0x1d0478 disabled, restarting
04-09 12:25:31.820: D/dalvikvm(10100): GC_CONCURRENT freed 1K, 7% free 33268K/35655K, external 408K/517K, paused 3ms+12ms
04-09 12:25:32.757: W/AudioTrack(10100): obtainBuffer() track 0x1d0478 disabled, restarting
04-09 12:25:33.187: D/dalvikvm(10100): GC_CONCURRENT freed 1K, 7% free 35316K/37703K, external 408K/517K, paused 3ms+13ms
04-09 12:25:33.929: W/AudioTrack(10100): obtainBuffer() track 0x1d0478 disabled, restarting
04-09 12:25:34.593: D/dalvikvm(10100): GC_CONCURRENT freed 1K, 7% free 37364K/39751K, external 408K/517K, paused 4ms+11ms
04-09 12:25:35.085: W/AudioTrack(10100): obtainBuffer() track 0x1d0478 disabled, restarting
04-09 12:25:36.039: D/dalvikvm(10100): GC_CONCURRENT freed 1K, 6% free 39412K/41799K, external 408K/517K, paused 3ms+12ms
04-09 12:25:36.242: W/AudioTrack(10100): obtainBuffer() track 0x1d0478 disabled, restarting
04-09 12:25:37.406: W/AudioTrack(10100): obtainBuffer() track 0x1d0478 disabled, restarting
04-09 12:25:37.617: D/dalvikvm(10100): GC_CONCURRENT freed 1K, 6% free 41460K/43847K, external 408K/517K, paused 5ms+13ms
04-09 12:25:38.640: D/dalvikvm(10100): GC_FOR_MALLOC freed 1K, 6% free 43507K/45895K, external 408K/517K, paused 933ms
04-09 12:25:38.656: I/SpeexThread(10100): exitting Thread
04-09 12:25:38.656: E/stopRecording(10100): stop Recording

AudiTrack 每隔几毫秒重新启动一次,并且几乎连续调用 GArbage Collection。如何最小化 GArbage Colloection 调用以及 AudioTrack 重启背后的原因是什么?请帮助...

最佳答案

该问题的临时解决方案是使用dalvik.system.VMRuntime.getRuntime().setMinimumHeapSize(32 * 1024 * 1024); 增加HeapSize; 然而这不推荐并且应该避免的方法。

通过广泛的调试,我发现真正的问题是由于接口(interface)重叠和一些功能泄漏。后来我删除其中一个接口(interface),重新设计整体解决方案,重构代码,解决了我的问题

如果您有其他解决方案,请分享,

关于android - 如何停止如此频繁地运行 GC_CONCURRENT?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10070189/

相关文章:

android.content.res.Resurces$NotFoundException : String resource ID #0x0

android - 使用 tensorflow 作为存储库构建基于 tensorflow 的 android 应用程序

javascript - 在指定的BPM中录制音频

java - 生成 Google App Engine 后端(JDK 1.8,安装了新的 ADT)时,注释仅适用于 java 1.5 及更高版本

android - SQLite:创建多个表与为大数据集过滤一个数据库

windows - AWS Windows Server 2008 上的 Edcast + Icecast

java - 音频文件Android

ios - 为特定 ASBD 缓冲区获取正确的数字数据类型转换

Android 麦克风在较新的设备上不断给出 32639 或 -32640

android - 如何在 Android 应用程序中录制声音