【Android】一个contentResolver引起的内存泄漏问题分析
长时间的压力测试后,系统发生了重启,报错log如下
JNI ERROR (app bug): global reference table overflow (max=51200)
global reference table overflow的log
08-08 04:11:53.052912 973 3243 F zygote64: indirect_reference_table.cc:256] JNI ERROR (app bug): global reference table overflow (max=51200)
08-08 04:11:53.053014 973 3243 F zygote64: indirect_reference_table.cc:256] global reference table dump:
08-08 04:11:53.053172 973 3243 F zygote64: indirect_reference_table.cc:256] Summary:
08-08 04:11:53.053184 973 3243 F zygote64: indirect_reference_table.cc:256] 27087 of com.android.server.content.ContentService$ObserverNode$ObserverEntry (27087 unique instances)
08-08 04:11:53.053197 973 3243 F zygote64: indirect_reference_table.cc:256] 22849 of java.lang.ref.WeakReference (22849 unique instances)
08-08 04:11:53.053210 973 3243 F zygote64: indirect_reference_table.cc:256] 313 of java.lang.Class (235 unique instances)
Backtrace:
#00 pc 000000000001d754 /system/lib64/libc.so (abort+120)
#01 pc 00000000004766f0 /system/lib64/libart.so (art::Runtime::Abort(char const*)+552)
#02 pc 000000000056c5ec /system/lib64/libart.so (android::base::LogMessage::~LogMessage()+1004)
#03 pc 0000000000264304 /system/lib64/libart.so (art::IndirectReferenceTable::Add(art::IRTSegmentState, art::ObjPtr<art::mirror::Object>)+764)
#04 pc 00000000002ff7fc /system/lib64/libart.so (art::JavaVMExt::AddGlobalRef(art::Thread*, art::ObjPtr<art::mirror::Object>)+68)
#05 pc 0000000000343834 /system/lib64/libart.so (art::JNI::NewGlobalRef(_JNIEnv*, _jobject*)+572)
#06 pc 000000000011fe5c /system/lib64/libandroid_runtime.so (JavaDeathRecipient::JavaDeathRecipient(_JNIEnv*, _jobject*, android::sp<DeathRecipientList> const&)+136)
#07 pc 000000000011f9a4 /system/lib64/libandroid_runtime.so (android_os_BinderProxy_linkToDeath(_JNIEnv*, _jobject*, _jobject*, int)+224)
根据经验,又是binder的溢出,因为在生成BinderProxy对象的时候,调用到了jobject javaObjectForIBinder方法,里面进行了NewGlobalRef操作
vi frameworks/base/core/jni/android_util_Binder.cpp
547 jobject javaObjectForIBinder(JNIEnv* env, const sp<IBinder>& val)
548 {
549 if (val == NULL) return NULL;
585 jobject refObject = env->NewGlobalRef(
586 env->GetObjectField(object, gBinderProxyOffsets.mSelf));
587 val->attachObject(&gBinderProxyOffsets, refObject,
588 jnienv_to_javavm(env), proxy_cleanup);
如果太多的BinderProxy对象没有释放,就会导致global reference table overflow。
我们使用dumpsys meminfo <system_server_PID>
来进行查看验证
ps -ef|grep system_s
system 820 480 1 18:05:55 ? 01:47:51 system_server
得到system_server的进程号为820
dumpsys meminfo 820
Views: 9 ViewRootImpl: 2
AppContexts: 25 Activities: 0
Assets: 11 AssetManagers: 13
Local Binders: 401 Proxy Binders: 16509
Parcel memory: 288 Parcel count: 249
Death Recipients: 15939 OpenSSL Sockets: 0
可以看到Proxy Binders非常多
我们可以在Binder的构造以及析构方法中添加log来观察是哪里new了太多的对象。
我们可以使用 dumpsys meminfo <PID> 命令逐个查看是哪个进程里new了过多的Local Binders来进行排查。
在这个例子中,我们查看到log中有
08-08 04:11:53.053172 973 3243 F zygote64: indirect_reference_table.cc:256] Summary:
08-08 04:11:53.053184 973 3243 F zygote64: indirect_reference_table.cc:256] 27087 of com.android.server.content.ContentService$ObserverNode$ObserverEntry (27087 unique instances)
08-08 04:11:53.053197 973 3243 F zygote64: indirect_reference_table.cc:256] 22849 of java.lang.ref.WeakReference (22849 unique instances)
08-08 04:11:53.053210 973 3243 F zygote64: indirect_reference_table.cc:256] 313 of java.lang.Class (235 unique instances)
ContentService$ObserverNode$ObserverEntry的泄漏较多,
对于ContentService,刚好可以使用命令 dumpsys content来进行查看
我们发现里面有上万个
settings/global/always_on_display_constants: pid=10928 uid=10027 user=-1 target=6497568
settings/global/always_on_display_constants: pid=10928 uid=10027 user=-1 target=57cdd81
pid=10928 是systemui
Unknown:/ # ps -ef|grep systemui
u0_a27 10928 480 0 18:20:02 ? 00:38:59 com.android.systemui
再来验证下
dumpsys meminfo 10928
Local Binders: 15629 Proxy Binders: 67
Parcel memory: 22 Parcel count: 83
Death Recipients: 2 OpenSSL Sockets: 0
再根据always_on_display_constants进行查找,就找到了注册Observer的地方了。
就定位到泄漏点了。
相关文章:
【Android】一个contentResolver引起的内存泄漏问题分析
长时间的压力测试后,系统发生了重启,报错log如下 JNI ERROR (app bug): global reference table overflow (max51200) global reference table overflow的log 08-08 04:11:53.052912 973 3243 F zygote64: indirect_reference_table.cc:256] JNI ER…...
2023年正版win10/win11系统安装教学(纯净版)
第一步:准备一个8G容量以上的U盘。 注意,在制作系统盘时会格式化U盘,所以最好准备个空U盘,防止资料丢失。 第二步:制作系统盘。 安装win10 进入windows官网 官网win10下载地址:https://www.microsoft.c…...
系统架构设计师-第11章-未来信息综合技术-软考学习笔记
未来信息综合技术是指近年来新技术发展而提出的一些新概念、新知识、新产品 信息物理系统(CPS ) ,人工智能( A l) ,机器人、边缘计算、数字孪生、云计算和大数据等技术 信息物理系统技术概述 信息物理系统的概念 信息物理系统是控制系统、嵌入式系统…...
Python __new__()方法详解
__new__() 是一种负责创建类实例的静态方法,它无需使用 staticmethod 装饰器修饰,且该方法会优先 __init__() 初始化方法被调用。 一般情况下,覆写 __new__() 的实现将会使用合适的参数调用其超类的 super().__new__(),并在返回之…...
虹科 | 解决方案 | 汽车示波器 索赔管理方案
索赔管理 Pico汽车示波器应用于主机厂/供应商与服务店/4S店的协作,实现产品索赔工作的高效管理;同时收集的故障波形数据,便于日后的产品优化和改进 故障记录 在索赔申请过程中,Pico汽车示波器的数据记录功能可以用于捕捉故障时的…...
详解Jmeter中的BeanShell脚本
BeanShell是一种完全符合Java语法规范的脚本语言,并且又拥有自己的一些语法和方法,所以它和java是可以无缝衔接的,学了Java的一些基本语法后,就可以来在Jmeter中写写BeanShell脚本了 在利用jmeter进行接口测试或者性能测试的时候,…...
前端和后端 优化
1.前端资源优化 1.1 html结构优化 保证简洁、清晰的html结构,减少或避免多余的html标签 使用HTML5的web语义化标签,结构清晰且利于seo css文件在head中引入,js文件放在body底部引入,这样做可以防止阻塞。另外如果有需要提前加载的…...
C++编译与运行:其二、编译期和运行期的区别
C的编译分为四步,最终生成一个可执行文件。 C的运行,就是将可执行文件交给操作系统,按照机器码逐步执行,运行功能。 先看一个非常非常有趣的例子: class Father{ public:virtual void f(){cout<<"I am fat…...
汽车电子专有名词与相应技术
1.EEA (Electronic & Electrical Architecture 电子电气架构) EEA在宏观上概括为物理架构与逻辑架构的结合,微观上通过众多电子元器件的协同配合,或集成式或分布式的系统级电子电气架构,具体详见专栏 新能源汽车电…...
idea 没加载 provided的包
目录 前言解决方案 前言 我的版本是IntelliJ IDEA 2022.1.4 (Community Edition),本地调试不知道为什么不加载provided的包。后来找到这篇文章https://youtrack.jetbrains.com/issue/IDEA-107048才知道这是个bug。不知道其他版本会不会出现这种问题。 解决方案 我…...
Hover:借贷新势力崛起,在经验与创新中找寻平衡
复苏中的Cosmos 如果让我选择一个最我感到可惜的区块链项目,我会选择Cosmos。 Cosmos最早提出并推动万链互联的概念,希望打通不同链之间的孤岛,彼时和另一个天王项目Polkadot号称跨链双雄。其跨链技术允许不同的区块链网络互相通信…...
软件设计原则-依赖倒置原则讲解以及代码示例
依赖倒置原则 一,介绍 1.前言 依赖倒置原则(Dependency Inversion Principle,DIP)是面向对象设计中的一个重要原则,由Robert C. Martin提出。 依赖倒置原则的核心思想是:高层模块不应该依赖于低层模块&…...
Linux--进程替换
1.什么是进程替换 在fork函数之后,父子进程各自执行代码的一部分,但是如果子进程想要执行一份全新的程序呢? 通过进程替换来完成,进程替换就是父子进程代码发生写时拷贝,子进程执行自己的功能。 程序替换就是通过特定的…...
【计算机网络】TCP协议
文章目录 1. TCP报文的结构2. TCP的发送缓冲区和接收缓冲区3. 确保可靠性序列号和确认序列号确认应答超时重传连接管理1️⃣三次握手建立连接2️⃣四次挥手断开连接 4. 提高性能流量控制滑动窗口拥塞控制延迟应答捎带应答 5. 面向字节流6. TCP/UDP对比 概念:TCP&…...
机器学习数据集:Kaggle
什么是Kaggle? Kaggle成立于2010年,是一个进行数据发掘和预测竞赛的在线平台。从公司的角度来讲,可以提供一些数据,进而提出一个实际需要解决的问题;从参赛者的角度来讲,他们将组队参与项目,针…...
软考 系统架构设计师系列知识点之设计模式(4)
接前一篇文章:软考 系统架构设计师系列知识点之设计模式(3) 所属章节: 老版(第一版)教材 第7章. 设计模式 第2节. 设计模式实例 3. 行为型模式 行为型模式可以影响一个系统的状态和行为流。通过优化状态…...
PyCharm 安装 cx_Oracle 失败
我在PyCharm的终端用 pip安装cx_Oracle失败,报错情况如下: ERROR: Could not build wheels for cx_Oracle, which is required to install pyproject.toml-based projects 出错原因: python 的版本太高了,我的是3.11版本的&…...
解决Windows出现找不到mfcm90u.dll无法打开软件程序的方法
今天,我非常荣幸能够在这里与大家分享关于mfc90u.dll丢失的5种解决方法。在我们日常使用电脑的过程中,可能会遇到一些软件或系统错误,其中之一就是mfc90u.dll丢失。那么,mfc90u.dll究竟是什么文件呢?接下来,…...
如何设计线程安全的 HashMap?
如何设计线程安全的 HashMap? HashMap 线程不安全的体现: 多线程下扩容死循环:JDK1.7中的 HashMap 使用头插法插入元素,在多线程的环境下,扩容的时候有可能导致环形链表的出现,形成死循环。因此,JDK1.8使…...
rpc汇总
1、什么是rpc rpc的应用,有哪些 Google 开源了 gRPC, Facebook 开源了 Thrift, Twitter 开源了 Finagle, 百度开源了bRPC, 腾讯开源了 Tars, 阿里开源了 Dubbo 和 HSF, 新浪开源了 Motan 等 gr…...
SVM与逻辑回归:从线性分类到核方法的原理、对比与实践指南
1. 项目概述:从线性分类到非线性世界的两把钥匙在机器学习的工具箱里,支持向量机(SVM)和逻辑回归(LR)是两把经久不衰的“瑞士军刀”。它们都源于线性模型,却通过不同的哲学路径,解决…...
现在不看就晚了:DeepSeek官方尚未文档化的量化后端适配漏洞(影响v3.1.0~v3.2.2所有Llama架构分支)
更多请点击: https://kaifayun.com 第一章:DeepSeek量化部署方案的背景与风险警示 近年来,随着大语言模型参数规模持续扩大,推理延迟与显存占用成为边缘设备与中等算力服务器落地的关键瓶颈。DeepSeek系列模型(如Deep…...
快速从 Excel 文件导入 SQL 数据库的方法与分析
引言 在日常数据处理、数据迁移或系统初始化工作中,我们经常需要将存储在 Excel 文件中的数据导入到 SQL 数据库(如 MySQL, PostgreSQL, SQL Server 等)中。手动逐条录入不仅效率低下,而且容易出错。本文将系统性地分析几种主流、高效的 Excel 导入 SQL 方法,并对比其优缺…...
用 AutoGen 编排多智能体协作,让 AI 团队帮你干活
🧑💻 博主介绍 & 诚邀关注 作者:专注于 Java、Python、前端开发的技术博主 | 全网粉丝 30 万 在校期间协助导师完成毕业设计课题分类、论文格式初审及代码整理工作;工作后持续分享毕设思路,助力毕业生顺利完成…...
电脑里突然冒出的FNPLicensingService.exe是啥?手把手教你关闭它(附Adobe/CAD/Xshell等软件排查指南)
电脑里突然冒出的FNPLicensingService.exe是啥?手把手教你关闭它(附Adobe/CAD/Xshell等软件排查指南)当你打开任务管理器,突然发现一个陌生的进程FNPLicensingService.exe在后台运行,甚至频繁请求联网,这难…...
5分钟实现Windows三指拖拽:macOS手势体验的终极解决方案
5分钟实现Windows三指拖拽:macOS手势体验的终极解决方案 【免费下载链接】ThreeFingersDragOnWindows Enables macOS-style three-finger dragging functionality on Windows Precision touchpads. 项目地址: https://gitcode.com/gh_mirrors/th/ThreeFingersDrag…...
中文医疗对话数据集:构建医疗大语言模型的黄金语料库
中文医疗对话数据集:构建医疗大语言模型的黄金语料库 【免费下载链接】Chinese-medical-dialogue-data Chinese medical dialogue data 中文医疗对话数据集 项目地址: https://gitcode.com/gh_mirrors/ch/Chinese-medical-dialogue-data 在医疗AI领域&#x…...
Java中的Comparator 和JS中的回调函数好相似
Comparator 在 Java 中的地位,非常像 JavaScript 中 Array.prototype.sort() 那个接收的 回调函数 (Comparison Function)。1. Comparator 是什么?在 Java 中,Comparator 是一个接口,它的核心作用是定义“比较逻辑”。在 Java 8 之…...
7种计时模式+智能联动:OBS高级计时器插件让你的直播时间管理更高效
7种计时模式智能联动:OBS高级计时器插件让你的直播时间管理更高效 【免费下载链接】obs-advanced-timer 项目地址: https://gitcode.com/gh_mirrors/ob/obs-advanced-timer 还在为直播中的时间管理而烦恼吗?无论是新手主播还是经验丰富的内容创作…...
对比直接使用厂商 API,通过 Taotoken 聚合调用的便利之处
🚀 告别海外账号与网络限制!稳定直连全球优质大模型,限时半价接入中。 👉 点击领取海量免费额度 对比直接使用厂商 API,通过 Taotoken 聚合调用的便利之处 1. 引言:从多平台管理到统一入口 在开发基于大语…...
