Android:减少花在garabage收集上的时间

Android:减少花在garabage收集上的时间,android,concurrency,garbage-collection,Android,Concurrency,Garbage Collection,我的openGL音频可视化工具落后于音乐,我有问题。我最近换了一种混合的方法。在三星S3上一切都很好,但在HTC Evo上,音频可视化工具落后于音乐 从音频输入到可视化的四个线程,AudioIn->AudioProc->UI->openGL。我认为问题可能出在openGL上,但在向requestRender()方法添加新消息之前,我开始清除messageque。没有帮助 我认为问题在于AudioIn和AudioProc之间,也就是说AudioProc花费的时间太长,并且正在建立一个新的平台。我一

我的openGL音频可视化工具落后于音乐,我有问题。我最近换了一种混合的方法。在三星S3上一切都很好,但在HTC Evo上,音频可视化工具落后于音乐

从音频输入到可视化的四个线程,AudioIn->AudioProc->UI->openGL。我认为问题可能出在openGL上,但在向requestRender()方法添加新消息之前,我开始清除messageque。没有帮助

我认为问题在于AudioIn和AudioProc之间,也就是说AudioProc花费的时间太长,并且正在建立一个新的平台。我一直在为GC_并发~43ms获取日志。在60赫兹时大约有2到3帧。DDMS中的分配跟踪程序建议AudioProc线程上的许多分配。因此,我删除了分配,并在我的DSP类中将它们替换为私有float[]对象

但随后分配开始显示一些对“JavaReflectArray”的调用,GC_并发调用的时间稍微长了一些。我想这可能是因为我在UI线程中声明了DSP类ref对象,并且我正在AudioProc线程中使用它,所以我更改了代码以调用AudioProc线程中的assign mDSP,但现在logcat显示对AudioProc线程的“JIT unchain all”调用和700+ms的GC_并发时间


很明显,我遗漏了一些基本的东西,请推测一下。我可以发布代码。

我猜“java反射数组”是
java.lang.reflect.array
。通过单击分配跟踪器中的条目,您应该能够从堆栈跟踪中了解更多信息。“JIT unchain all”意味着线程需要很长时间才能挂起,VM怀疑线程可能在编译代码中旋转,因此它正在分解一些编译代码以确保它到达安全点并挂起。感谢快速响应。堆栈跟踪隐藏在底部,因此您的评论会有所帮助。我昨天花了一整天的时间在这上面,我将在上面添加一些注释,但问题仍然是AudioIn线程创建的工作比AudioProc线程能够处理的要多。。。也许三星S3只是有一个更好的处理器,或者HTC不是多线程的,所以GC_并发没有持续发生……并发GC日志看起来像
GC_并发释放412K,5%空闲8958K/9396K,暂停4ms+1ms,总计35ms
。重要的数字是暂停时间,因为这些数字表示所有线程都已暂停的时间。“总”时间在多核设备上不太重要,因为理想情况下,它是同时发生的。其他GC消息(如
GC\u FOR_ALLOC
GC\u EXPLICIT
WAIT\u FOR_CONCURRENT\u GC
)对于实时处理来说更是个问题。