如何解决android频繁的垃圾回收?
How to solve frequent garbage collection in android?
我们的团队陷入了这个问题,我们的android应用程序在使用一段时间后滞后,这里是Android内存分析器。
我注意到 垃圾收集过于频繁,我几乎解决了我们应用程序的所有内存泄漏问题。
要记住的要点:
- 这是由于任何模块或库引起的吗?
- 在 Playstore 等嵌套回收器视图中使用过多图像。
- 使用延迟 1.5 秒的 AutoScrollViewPager
- 使用图像库 Glide 在整个应用程序中加载图像。
这是在详细日志中几秒钟后发生的:
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
任何关于这个问题的建议都会对大家有所帮助。
谢谢
我们的团队陷入了这个问题,我们的android应用程序在使用一段时间后滞后,这里是Android内存分析器。
我注意到 垃圾收集过于频繁,我几乎解决了我们应用程序的所有内存泄漏问题。
要记住的要点:
- 这是由于任何模块或库引起的吗?
- 在 Playstore 等嵌套回收器视图中使用过多图像。
- 使用延迟 1.5 秒的 AutoScrollViewPager
- 使用图像库 Glide 在整个应用程序中加载图像。
这是在详细日志中几秒钟后发生的:
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
任何关于这个问题的建议都会对大家有所帮助。 谢谢