Android应用中的垃圾收集导致UI线程冻结.由对象创建引起的 - 对象汇集了答案吗?

nir*_*267 5 multithreading android garbage-collection memory-management ros

我继承了一个包含大量外部库的相当大的代码库,对于java/android/app开发来说是全新的.抱歉,如果我的某些术语已关闭或我遗漏了必要的信息.

我有一个应用程序,它有一个使用unity的显示线程(com.unity3d.player).此外,在我认为是后台线程的情况下,应用程序订阅了ROS消息(使用外部ROSjava/rosandroid库,尽管在本地进行了一些小修改).这会导致大量的对象创建,我认为所有这些都来自于读取ROS消息(以及反序列化,将数据放入哈希映射,然后获取它),这会导致大量垃圾收集,从而冻结应用程序.我最终得到一个"暂停所有线程"的消息.

我注意到应用程序并没有占用大量内存,因此我想知道是否有办法强制它快速分配更多内存而不是垃圾收集和冻结.在搜索中我也遇到过对象池作为解决这个问题的方法,但也发现人们说这只会不必要地干扰GC; 可以在消息阅读部分添加对象池帮助我的情况吗?我知道我需要以这样的方式实现这一点,即数据仍然正确缓冲,因此它不会以某种方式丢失.

感谢您提供的任何建议.以下是一些显示内存分配问题线程的屏幕截图.

ScreenShot1

ScreenShot2