微信不死进程的理解

微信不死进程的理解

我的研究缘由很多,你可以听我讲废话。最近搞鲁班猫安卓板卡总是觉得卡卡的,然后发现可能是板卡的ddr只有2g,我安卓镜像用的sd卡启动。

一共1.9g的ddr,用了1.8g真的老实了。只有36m可用,共享内存有15m,缓存816k。swap分区共976m,可用222m,空闲754m。

Ddr:

Ram的一种,动态随机存取存储器。

缓存:

内核中的缓存主要分为 Buffer(缓冲区) 和 Cache(页缓存) 两类。为提升系统 IO 效率和内存复用率而设计的内存管理机制。缓存占用的是 DDR 物理内存。

共享内存:

  1. 节省物理内存,避免重复拷贝。多个进程如果需要访问同一份数据(比如系统库、应用的公共资源),不需要各自在内存中存一份副本,而是共享同一块物理内存。
  2. 高效进程间通信(IPC)。传统 IPC 方式(如管道、Socket)传输数据时,需要经过 “用户态 → 内核态 → 用户态” 的多次拷贝,效率较低;而共享内存直接让多个进程访问同一块内存,数据无需拷贝,是最快的 IPC 方式。

Swap:

是系统在磁盘 / 闪存(sd卡/emmc)上划分的一块区域,核心作用是 当 DDR 物理内存不足时,临时 “置换” 出部分内存数据到磁盘,释放 DDR 空间给活跃进程使用,相当于 DDR 的 “扩展备胎”。

怎么就剩这么点了,于是我输入ps -e –sort=-rss来查看从大到小排序的执行进程。于是我看到了

这只是一部分。User是用户名。Pid是进程的id。Ppid是这个进程的父进程的id。Vzs是这个软件预计占据空间(实际上没有任何意义,因为存在不被使用的部分,是虚拟的)。Rss是进程当前占用的ddr大小。Wchan用于标识进程当前休眠的原因。ep_poll 是 epoll 机制在内核中的等待标记,epoll 是 Linux 内核提供的高性能 I/O 多路复用机制,核心作用是让单个进程高效管理大量 I/O 描述符(FD),只在 “有事件发生时” 被唤醒,其余时间休眠,避免空耗 CPU。所以wchan是eppoll基本上是等到io操作中,所以才睡眠。Addr是地址,一般是0,是虚拟地址。S是状态,有s可中断休眠,r准备,z僵尸和d不可中断休眠。Name就是进程名字。

上图看到com.tencent.mm进程的名字出现了3次,分别是主进程,push进程和recovery进程。占用了我几百m的内存(ddr内存)。我就想着我板卡b站打不开会不会是因为微信进程吃太多内存了导致没办法开b站。我kill所有的带com.tencent.mm的进程。结果怎么kill都kill不掉。

先看一张流程图

Ams:

是安卓系统的核心进程管家,是一个核心线程,它运行在 system_server 进程中,不是独立进程(所以 ps 看不到),却是微信后台自启、秒重启的总指挥。AMS 负责管理安卓应用的四大组件(Activity/Service/BroadcastReceiver/ContentProvider),微信的 :push 服务就是一个 Service 组件。

Binder:

是安卓系统基于 Linux 内核实现的内核态进程间通信(IPC)驱动 / 机制—— 它是连接 AMS、zygote64、微信进程的 “核心通信总线”,也是微信 “杀不死” 的底层技术基石。

zygote64 :

是安卓系统的 64 位应用进程孵化器,是所有 64 位安卓应用进程(如微信主进程 /:push/:recovery、B 站进程)的父进程,核心作用是高效创建应用进程。之前我们在进程图看到微信的三个进程父进程都是269,其实269就是zygote64。他的父进程是init进程。

我打开重启系统不久,然后就会发现微信的进程默认在我手机里执行了。可能是因为加入了白名单或者提供了自启动权限,但是我安卓11镜像没找到这些,只能暂时这样理解了。

微信里有这么一个东西

你能看到标志被设置成了start_sticky。这是微信不死的关键,太深入的我就没研究了。

我们讲讲主进程被杀、:push 进程被杀、:recovery 进程被杀、:push+recovery 进程都被杀 这四种场景的重启逻辑。

前提共识:

1、微信的 :push 进程 运行 PushService 组件,向 AMS 注册了 START_STICKY 粘性服务 → AMS 会为其注册 Binder 死亡回调,主动重启。

2、:recovery 进程 是微信应用层的守护进程,和 :push 双向心跳互监 → 属于 “应用层续命”,不影响 AMS 的系统层管控。

3、主进程 运行微信界面(Activity),无粘性服务标记 → AMS 不会主动监听和重启。

场景 1:只杀主进程 → 不会被 AMS 重启,仅在需要时被 :push 唤醒

具体流程:

1、主进程被杀后,AMS 无感知:

主进程没有向 AMS 注册粘性服务,AMS 也没有为其绑定 DeathRecipient 死亡回调 → 主进程被杀后,AMS 完全不干预,不会主动重启。

2、:push 和 :recovery 正常存活:

这两个进程处于 wchan=ep_poll 休眠态,监听 Binder / 网络事件,不影响微信的推送能力。

3、主进程的 “被动重启” 触发条件“:

只有当 :push 进程收到新消息,需要弹出通知或打开微信界面时,:push 才会通过 Binder 向 AMS 发送 START_ACTIVITY 请求 → AMS 调用 zygote64 fork() 生成新的主进程。

关键结论:

主进程被杀后不会自动重启,只有需要展示界面 / 通知时才会被 :push 唤醒。微信的核心推送能力不受影响。

场景 2:只杀 :push 进程 → AMS 主动秒重启,:recovery 辅助兜底

具体流程:

1、Binder 驱动触发 AMS 死亡回调:

:push 进程被杀 → 其与 AMS 之间的 Binder 连接断开 → Binder 驱动立刻触发 AMS 预注册的 DeathRecipient 回调 → 向 AMS 发送「:push 已死」的信号。

2、AMS 主动决策重启:

AMS 读取 ServiceRecord 数据结构,发现 :push 服务是 START_STICKY 标记 → 判定 “必须重启” → 通过 Binder 向 zygote64 发送 FORK_AND_SPECIALIZE 请求。

3、zygote64 快速生成新 :push 进程:

zygote64 基于预加载的系统库,通过 fork() + 写时复制机制,毫秒级创建新的 :push 进程。

4、:recovery 辅助兜底(可选):

若 AMS 重启延迟,:recovery 会通过心跳感知 :push 死亡 → 主动向 AMS 发 START_SERVICE 请求,加速 :push 重启。

5、新 :push 进程恢复状态:

新进程向 AMS 重新注册 START_STICKY 服务 → 进入 wchan=ep_poll 休眠态,恢复推送监听。

关键结论:

只杀 :push → AMS 必主动重启,这是微信 “杀不死” 的核心场景。

场景 3:只杀 :recovery 进程 → 无系统层重启,:push 主动重建 :recovery

具体流程:

1、:push 进程感知 :recovery 死亡:

:push 和 :recovery 通过共享内存心跳 + epoll 管道监听实现互监 → :push 长时间读取不到 :recovery 的心跳状态 → 判定 “:recovery 已死”。

2、:push 主动发起重建请求:

:push 进程通过 Binder 向 AMS 发送 START_SERVICE 请求,参数是 :recovery 对应的服务组件。

3、AMS 允许启动,zygote64 生成新 :recovery 进程:

由于 :recovery 是微信的普通服务(非粘性),AMS 校验权限合法后 → 通知 zygote64 fork() 生成新的 :recovery 进程。

4、恢复双向互监:

新 :recovery 进程与 :push 重建心跳和管道监听,回到应用层守护状态。

关键结论:

只杀 :recovery → AMS 不主动干预,重启完全由 :push 进程在应用层触发,属于微信自己的 “双保险” 机制。

场景 4::push + :recovery 进程都被杀 → AMS 主导重启 :push,再由 :push 重建 :recovery

具体流程:

1、AMS 只监听 :push,无视 :recovery:

两个进程同时被杀后,只有 :push 进程的 Binder 断开会触发 AMS 的死亡回调 → AMS 完全不关心 :recovery 的死活。

2、AMS 按规则重启 :push 进程:

流程和场景 2完全一致:Binder 回调触发 → AMS 决策 → zygote64 fork() 生成新 :push 进程。

3、新 :push 进程主动重建 :recovery:

新 :push 进程初始化时,执行微信内置的代码逻辑 → 向 AMS 发送启动 :recovery 的请求 → AMS 允许后,zygote64 生成新的 :recovery 进程。

4、恢复完整保活状态:

新 :push 和 :recovery 重建双向互监,回到 wchan=ep_poll 休眠态,完成重启。

5、后续有通知:

和场景1一样。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/1069055.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

下一阶段的技术与生态:多模态、生成式与人机协作的“新均衡”

【摘要】多模态生成模型、人机协作范式与技术平权正重塑AI量化投资。文章从技术、流程、监管三线并行,探讨其迈向可持续治理与产业化的新均衡路径。引言量化投资领域正经历一场深刻的结构性变革。这场变革的驱动力,不再仅仅是算力的堆砌或模型的迭代&…

Java反射:解锁框架开发的终极密码,让代码拥有“动态灵魂“!!

Java反射:解锁框架开发的终极密码,让代码拥有"动态灵魂"!作为Java开发者,你是否曾好奇:Spring为何能自动注入对象?MyBatis为何能通过接口映射数据库操作?这些框架的"黑魔法"…

最小二乘支持向量机(LSSVM)结合遗传算法(GA)解决单目标优化问题,MATLAB代码

一、研究背景 该研究主要围绕 机器学习建模与优化问题 展开。在工程、金融、工业等领域,经常需要建立输入变量与输出目标之间的非线性映射关系,并在此基础上寻找最优输入组合以最大化或最小化目标值。传统建模方法往往难以处理高维、非线性问题&#xff…

kettle调度系统- 脚本执行错误信息邮件预警,及时发现解决问题,捍卫生产环境

场景: 我们在使用kettle的过程中,可以针对每个脚本文件进行异常捕获和发送邮件,也可以使用xkg-pdi平台统计进行异常捕获。今天我们一起来学习下如何使用xkg-pdi来捕获异常并且发送邮件进行预警。 1、配置邮箱 我这里…

解锁时间魔法:SQL中TIMESTAMPDIFF函数的使用指南

文章目录 一、函数概述:为什么需要 TIMESTAMPDIFF? 二、核心语法与参数解析 1. 基础语法 2. 关键参数详解 (1)时间单位`unit`完整支持列表 (2)时间参数`start_datetime`/`end_datetime` 三、实战示例:覆盖 80% 使用场景(新增扩展案例) 1. 基础单位计算(新增微秒、季度…

国产数据库:从替代到引领,重塑数字经济核心底座

目录 一、市场爆发:3.3万亿信创浪潮下的国产崛起 二、技术破壁:从“二次开发”到“原生创新”的跨越 1. 分布式架构:支撑海量高并发场景 2. 云原生融合:实现极致弹性与成本优化 3. 多模与AI融合:拓展场景适配能力…

7、索引设计的原则

索引设计的原则适合索引的列是出现在where子句中的列,或者连接子句中指定的列基数较小的类,索引效果较差,没有必要在此列建立索引使用短索引,如果对长字符串列进行索引,应该指定一个前缀长度,这样能够节省大…

深入理解Linux内核中断的下半部机制-软中断和tasklet

文章目录引言上半部和下半部软中断和tasklet软中断tasklet总结引言 我想先用一种不同于其他博客的方式来引入本篇文章的核心:软中断和tasklet 我们先来看下面这个代码: 以上是我刚踏足嵌入式领域时,接触到的一份代码。那时是从单片机开始入门的&#…

西湖大学突破:大模型“模仿-探索“两阶段训练法效果更优

这项由西湖大学工程学院丁博文、陈宇涵等研究者联合华为诺亚方舟实验室共同完成的研究,发表于2025年12月的arXiv预印本(编号:arXiv:2512.11470v1),对当前大语言模型的训练方式提出了根本性的重新思考。有兴趣深入了解的…

即插即用系列 | CVPR 2025:SCSegamba:轻量级结构感知 Mamba,重新定义裂缝分割 SOTA

论文标题:SCSegamba: Lightweight Structure-Aware Vision Mamba for Crack Segmentation in Structures 论文原文 (Paper):https://arxiv.org/pdf/2503.01113 代码 (code):https://github.com/Karl1109/SCSegamba GitHub 仓库链接&#xff0…

完整理解乐观锁!!(以预定系统为例)

乐观锁:并发控制的智慧之道什么是乐观锁?乐观锁(Optimistic Locking)是一种并发控制机制,其核心思想是"假设冲突很少发生"。与悲观锁(Pessimistic Locking)不同,悲观锁在访…

YOLOv11 改进 - C2PSA | C2PSA融合TSSA(Token Statistics Self-Attention)令牌统计自注意力,优化遮挡目标感知

前言 本文介绍了Token Statistics Self-Attention(TSSA)机制,并将其集成到YOLOv11中。传统自注意力计算复杂度高,TSSA进行了范式转变,基于token统计特征实现高效注意力交互。它通过“算法展开”推导得出,以“最大编码率降低”为目标,实现特征学习。TSSA包含动态分组和低…

(35)使用Spring的AOP

Spring对AOP的实现包括以下3种方式: 第一种方式:Spring框架结合AspectJ框架实现的AOP,基于注解方式。第二种方式:Spring框架结合AspectJ框架实现的AOP,基于XML方式。第三种方式:Spring框架自己实现的AOP&am…

RabbitMQ vs RocketMQ ——延迟 / 定时消息落地终极指南

延迟消息 = “消息在未来某个时间点才能被消费”,属于 异步事件驱动系统中最常见的需求 📌 如:订单未支付 30 分钟自动取消、T+1 清算、优惠券过期、短信失败重试、IoT 数据延迟触达 不同 MQ 的实现方式天差地别,本文一次讲透👇 🎯 一、业务为什么需要延迟消息? 🛒…

(36)通知与切面

通知类型 通知类型包括: 前置通知:Before 目标方法执行之前的通知后置通知:AfterReturning 目标方法执行之后的通知环绕通知:Around 目标方法之前添加通知,同时目标方法执行之后添加通知。异常通知:AfterTh…

外卖骑手实时就近派单全攻略:SpringBoot + GeoHash 高效实现

一、核心问题:如何快速找到最近的骑手? 用户在城市下单时,系统需要即时回答:方圆3公里内,哪些骑手是空闲的?谁离我最近? 传统方法: 获取所有空闲骑手经纬度 (lng, lat) 计算距离 排序找出最近的骑手 问题:城市有数万骑手时,每次计算数万距离,数据库和服务器瞬间崩…

我发现大文件HTTP上传阻塞 后来才知道用分块编码流式传输

💓 博客主页:瑕疵的CSDN主页 📝 Gitee主页:瑕疵的gitee主页 ⏩ 文章专栏:《热点资讯》 目录我和Node.js的相爱相杀史:从“Hello World”到深夜崩溃指南 一、初遇Node.js:你以为你在学后端&…

基于PSO-GA混合算法的施工进度计划多目标优化,以最小化总成本并实现资源均衡,满足工期约束和资源限制,MATLAB代码

一、主要功能 该代码实现了一个基于PSO-GA混合算法的铁路工程施工进度计划多目标优化,旨在通过智能优化算法调整施工活动中各作业组数和开工时间,以最小化总成本(考虑资金时间价值)并实现资源均衡,同时满足工期约束和…

(37)全注解式开发AOP

就是编写一个类,在这个类上面使用大量注解来代替spring的配置文件,spring配置文件消失了,如下: package com.powernode.spring6.service;import org.springframework.context.annotation.ComponentScan; import org.springframewo…

Java计算机毕设之基于VUE的旅游信息分享管理平台基于Springboot+Vue的旅游攻略分享平台系统(完整前后端代码+说明文档+LW,调试定制等)

博主介绍:✌️码农一枚 ,专注于大学生项目实战开发、讲解和毕业🚢文撰写修改等。全栈领域优质创作者,博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java、小程序技术领域和毕业项目实战 ✌️技术范围:&am…