频繁gc

在下载13000个图片时候,看logcat日志基本每个2、3s就会出发gc。频繁的gc就是频繁申请内存但是内存不足取回收又回收不了。

Background concurrent copying GC freed 37306(4643KB) AllocSpace objects, 63(5252KB) LOS objects, 49% free, 9633KB/18MB, paused 116us total 109.126ms

不太懂没关系,deepseek一下:

···
我来分析一下,我现在需要帮助用户理解他们提供的 GC 日志信息。用户给出的日志是:“Background concurrent copying GC freed 37306 (4643KB) AllocSpace objects, 63 (5252KB) LOS objects, 49% free, 9633KB/18MB, paused 116us total 109.126ms”。首先,我需要解析每一部分的含义,然后解释整个日志的意义,可能的原因以及解决方案。
首先,GC 日志中的 “Background concurrent copying GC” 表示这是一个后台并发复制的垃圾回收过程。Android 中的 ART 运行时使用的是并发标记 - 清除(CMS)或并发复制算法,这里的 “concurrent copying” 可能指的是在后台线程中进行的复制操作,以减少暂停时间。
接下来,“freed 37306 (4643KB) AllocSpace objects” 指的是在这次 GC 中,回收了 37306 个对象,总大小为 4643KB。AllocSpace 是 ART 中的一种内存分配区域,用于分配普通对象。而 “63 (5252KB) LOS objects” 中的 LOS 是 Large Object Space 的缩写,这里回收了 63 个大对象,总大小 5252KB。大对象通常是指超过一定阈值(比如 12KB)的对象,会被直接分配到 LOS 中。
然后,“49% free” 表示当前堆的空闲空间占 49%。“9633KB/18MB” 显示当前已使用的内存是 9633KB,总堆大小是 18MB。这里需要注意,总堆大小可能不是固定的,Android 会根据需要动态调整,但某些情况下可能会受到限制。
最后,“paused 116us total 109.126ms” 说明 GC 过程中应用暂停的时间,其中 116 微秒是用户线程暂停的时间,而总 GC 时间是 109.126 毫秒。这说明大部分时间 GC 是在后台并发进行的,对应用的影响较小。
接下来,我需要分析可能的原因。频繁的 GC 可能意味着内存分配过多,或者存在内存泄漏。特别是当 LOS 中有大量大对象被回收时,可能是因为应用频繁创建大对象,导致堆内存波动较大。此外,堆内存使用接近上限(当前使用了 9633KB,总 18MB,约 53%),但空闲率 49%,这似乎矛盾,可能需要进一步确认数据是否正确,或者是否有其他因素影响。
可能的解决方案包括:优化内存分配,减少不必要的对象创建,尤其是大对象;检查是否存在内存泄漏,使用工具如 Android Profiler 来分析堆内存;调整堆大小参数,不过这通常由系统管理,应用层可能无法直接修改;或者调整 GC 触发的阈值,但这也需要谨慎处理。
另外,需要考虑用户的应用场景。如果用户的应用是在处理大量数据,比如图像处理、视频编解码等,可能会导致频繁的大对象分配,这时候优化算法或使用对象池技术可能会有帮助。同时,确保及时释放不再使用的资源,避免引用链导致对象无法被回收。
总结来说,用户的日志显示 GC 回收了大量对象,尤其是 LOS 中的大对象,当前堆内存使用情况需要关注是否正常,是否存在潜在的内存问题。需要结合应用的具体情况进一步分析,可能需要使用内存分析工具来找出问题根源。
···

主要说下我在下载图片过程中程序的问题:

  1. 在循环中获取下载图片链接时候是拼接字符串API+stucode+.jpg类似这种处理

优化:将图片链接在创建对象时候处理好

  1. 日志频繁,在下载流程中写了很多日志记录流程,并且日志信息字符串拼接参数

优化:去掉一些非关键的日志

  1. 写文件使用的是通用的写入

优化:使用Channel方式写文件

posted @ 2025-03-13 10:50 拜雨 阅读(8) 评论(0) 推荐(0) 编辑
摘要: 跨应用启动UIAbility 上篇介绍了应用内启动UIAbility,这篇介绍下应用间的启动方式 应用间UIAbility跳转使用openLink()与startAbility()两个接口均可以实现,应用间跳转主要基于应用链接进行实现(应用内界面跳转页可以通过URI的方式打开),应用链接格式sche 阅读全文 »
posted @ 2025-03-06 14:56 拜雨 阅读(9) 评论(0) 推荐(0) 编辑
摘要: 应用内启动UIAbility 上篇介绍了UIAbility生命周期,这篇学习下UIAbility页面间的跳转。UIAbility对照Android中的Activity,在Android启动其他页面可以通过startActivity(),在Harmony中也有类似的方法startAbility()。 阅读全文 »
posted @ 2025-03-06 14:53 拜雨 阅读(14) 评论(0) 推荐(0) 编辑
摘要: 安装https://www.cnblogs.com/sowler/p/18228732这个步骤安装,启动失败 sudo systemctl start docker 查看状态 leoliu@bogon:~$ sudo systemctl status docker × docker.service 阅读全文 »
posted @ 2025-03-05 11:52 拜雨 阅读(80) 评论(0) 推荐(0) 编辑
摘要: UIAbility启动模式 什么是UIAbility? UIAbility组件是一种包含UI的应用组件,主要用于和用户交互 。它是HarmonyOS中用于系统调度的基本单元,为应用提供绘制界面的窗口。 其他官方专业数据就不赘述了,简单将就是手机应用里的一个UI窗口。这个类比Android里的Acti 阅读全文 »
posted @ 2025-02-24 14:28 拜雨 阅读(8) 评论(0) 推荐(0) 编辑
摘要: UIAbility生命周期 什么是UIAbility? UIAbility组件是一种包含UI的应用组件,主要用于和用户交互 。它是HarmonyOS中用于系统调度的基本单元,为应用提供绘制界面的窗口。 其他官方专业数据就不赘述了,简单将就是手机应用里的一个UI窗口。这个类比Android里的Acti 阅读全文 »
posted @ 2025-02-21 16:59 拜雨 阅读(11) 评论(0) 推荐(0) 编辑
摘要: 如何在Kotlinx序列化中对BigDecimal和BigInteger进行JSON编码而不损失精度? 按着这里大佬的回答可以解决。但是有一点需要注意 我使用最新的kotlinx-serialization-json 1.8.0, idea在编译时候private object BigDecimal 阅读全文 »
posted @ 2025-01-17 14:31 拜雨 阅读(19) 评论(0) 推荐(0) 编辑
摘要: 我在Android8.0上增加的截屏功能,也声明了响应权限,但是在Android11上就报权限错误。原来在Android10以后启动前台服务时候有第三个参数。 低版本我们调用 public final void startForeground(int id, Notification notific 阅读全文 »
posted @ 2024-12-10 11:27 拜雨 阅读(405) 评论(0) 推荐(0) 编辑
摘要: 常量定义 在HarmonyOS中我们如果定义常量,可以创建常量类并导出,通过static readonly修饰。 export class ApiConst{ /** * api根路径 */ static readonly BASE_API: string = "http://192.168.100 阅读全文 »
posted @ 2024-12-09 16:48 拜雨 阅读(39) 评论(0) 推荐(0) 编辑
摘要: 预览 Harmony开发和Compose类似,在组件上增加@Preview后则可以在预览面板上看到UI效果。 组件预览 我们新建一个组件,该组件仅展示一个文本内容。 @Component export struct HelloComponent { @State message: string = 阅读全文 »
posted @ 2024-11-27 16:33 拜雨 阅读(10) 评论(0) 推荐(0) 编辑
点击右上角即可分享
微信分享提示