如何解决android频繁的垃圾回收?

How to solve frequent garbage collection in android?

我们的团队陷入了这个问题,我们的android应用程序在使用一段时间后滞后,这里是Android内存分析器

我注意到 垃圾收集过于频繁,我几乎解决了我们应用程序的所有内存泄漏问题。

要记住的要点:

这是在详细日志中几秒钟后发生的:

2022-03-15 16:37:47.761 30333-30358/com.app I/com.app: Background concurrent copying GC freed 417454(8609KB) AllocSpace objects, 2(328KB) LOS objects, 27% free, 16MB/22MB, paused 241us total 153.080ms

2022-03-15 16:37:51.226 30333-30358/com.app I/com.app: Background young concurrent copying GC freed 330919(6815KB) AllocSpace objects, 0(0B) LOS objects, 28% free, 14MB/20MB, paused 685us total 129.321ms

2022-03-15 16:37:51.580 30333-30358/com.app I/com.app: Background concurrent copying GC freed 520664(10MB) AllocSpace objects, 1(132KB) LOS objects, 31% free, 12MB/18MB, paused 131us total 165.951ms

2022-03-15 16:37:58.195 30333-30358/com.app I/com.app: Background concurrent copying GC freed 391436(8248KB) AllocSpace objects, 1(68KB) LOS objects, 26% free, 16MB/22MB, paused 426us total 239.756ms

任何帮助将不胜感激。

经过一些研发和建议工作后,我们的应用程序有 50-70%(取决于不同设备上的 RAM)性能比以前更好。

我针对这个问题提出了一些观点,我的配置是:

  • 是不是模块或库引起的??

一些模块在调试时使我们的APK大小有点大。因此,如果我们应用 progaurd 或使用 bundle,那么我们的应用 APK 的大小将会变小,届时占用的 RAM 也会减少。

  • 在 Playstore 等嵌套回收器视图中使用过多图像。

使用著名的图像加载库,如 glide 或 Picasso, 我们需要对我们一次又一次使用的图像进行位图池化。 这将帮助我们避免为相同的图片 URL 使用越来越多的位图

参考:Here is the good guidance, how to optimize recycler view

  • 使用延迟 1.5 秒的 AutoScrollViewPager

这是一个主要问题,在使用应用程序 3-5 分钟后,GC 调用如此频繁,这是由于 ViewPager.setCurrentItem()。对于我们使用 ViewPager 并更改页面 GC 调用的整个应用程序。

在 AutoScrollViewPager 中有 1.5 秒的延迟,然后是 ViewPager AutoScrolls,然后是 GC 调用。这就是为什么每 2 秒后 android 分析器中有太多 GC。

所以,我们删除了 AutoScrolling 的代码,性能比上一个场景更好。

其他一些优化是:

  • 将多个实例替换为单例实例。
  • 已从应用程序中删除所有泄漏。

参考:Here is about Memory Leaks in Android

任何关于这个问题的建议都会对大家有所帮助。 谢谢