英文企业网站建设/营销策划书模板
背景:
android系统开发过程中,经常会遇到一些low memory kill的问题,在分析这些系统低内存导致被杀问题时候,经常因为不好复现而成为一个比较烦恼的阻碍。因为这种低内存问题本身就不属于一种功能操作类型的问题,属于一种系统当前可使用的内存少导致的问题,所以分析这类lmk低内存被杀的情况迫切需要一种可以帮助我们复现系统低内存的工具,今天马哥就给大家介绍一个内存压力工具mem-pressure详细使用和源码剖析。
mem-pressure工具实战展示
系统的mem-pressure并不是自带集成的,需要集成这个mem-pressure工具是需要自己进行额外编译的,所以要先进行编译mem-pressure的bin文件后再使用。
编译mem-pressure
test@test:~/aosp15$ make mem-pressure
============================================
PLATFORM_VERSION_CODENAME=VanillaIceCream
PLATFORM_VERSION=VanillaIceCream
TARGET_PRODUCT=sdk_phone64_x86_64
TARGET_BUILD_VARIANT=eng
TARGET_ARCH=x86_64
TARGET_ARCH_VARIANT=x86_64
TARGET_2ND_ARCH_VARIANT=x86_64
HOST_OS=linux
HOST_OS_EXTRA=Linux-5.15.0-130-generic-x86_64-Ubuntu-20.04.3-LTS
HOST_CROSS_OS=windows
BUILD_ID=AP3A.241005.015.A2
OUT_DIR=out
============================================
[100% 6/6 1s remaining] Install: out/target/product/emu64x/system/bin/mem-pressure#### build completed successfully (6 seconds) ####
注意这里可以看到可以成功编译出mem-pressure
然后在push到手机设备上
test@test:~/aosp15$ adb push out/target/product/emu64x/system/bin/mem-pressure /data/local/tmp/
out/target/product/emu64x/system/bin/mem-pressure: 1 file pushed, 0 skipped. 82.2 MB/s (51264 bytes in 0.001s)
接下来既可以正常使用mem-pressure
130|emu64x:/data/local/tmp # ./mem-pressure -h
Usage: [OPTIONS]-d N: Duration in microsecond to sleep between each allocation.-i N: Number of iterations to run the alloc process.-o N: The oom_score to set the child process to before alloc.-s N: Number of bytes to allocate in an alloc process loop.
Aborted
可以看到mem-pressure可以设置一些参数
正常使用也可以不带任何的参数,都使用默认的:
emu64x:/data/local/tmp # ./mem-pressure
Child 0 allocated 5936 MB
Child 1 allocated 5968 MB
可以到执行mem-pressure后有多个子进程在申请5936 MB内存,同时看看logcat是否有lowmemorykiller相关打印:
源码分析
源码路径:
system/extras/alloc-stress/mem-pressure.cpp
完整源码:
先看main方法
void usage() {printf("Usage: [OPTIONS]\n\n"" -d N: Duration in microsecond to sleep between each allocation.\n"" -i N: Number of iterations to run the alloc process.\n"" -o N: The oom_score to set the child process to before alloc.\n"" -s N: Number of bytes to allocate in an alloc process loop.\n");
}int main(int argc, char* argv[]) {pid_t pid;size_t* shared;int c, i = 0;size_t duration = 1000;int iterations = 0;const char* oom_score = "899";size_t step_size = 2 * 1024 * 1024; // 2 MBsize_t size = step_size;while ((c = getopt(argc, argv, "hi:d:o:s:")) != -1) {switch (c) {case 'i':iterations = atoi(optarg);break;case 'd':duration = atoi(optarg);break;case 'o':oom_score = optarg;break;case 's':step_size = atoi(optarg);break;case 'h':usage();abort();default:abort();}}shared = (size_t*)mmap(NULL, sizeof(size_t), PROT_READ | PROT_WRITE, MAP_ANONYMOUS | MAP_SHARED,0, 0);while (iterations == 0 || i < iterations) {*shared = 0;pid = fork();//不断for新的子进程if (!pid) {/* Child */add_pressure(shared, size, step_size, duration, oom_score);//子进程开始添加内存压力,这个是核心方法/* Shoud not get here */exit(0);} else {wait(NULL);//主进程一直等待,等到子进程内存到达极限死了,才会进行往下执行printf("Child %d allocated %zd MB\n", i, *shared / 1024 / 1024);//打印出子进程已经申请了多少内存size = *shared / 2;}i++;}
}
可以总结一下mem-pressure核心如下:
1、不断创建新的子进程
2、每个子进程进行相关的内存申请
3、子进程内存达到极限被杀了后会打印出申请的内存值
再看具体是怎么给进程内存加压的
//申请指定内存大小并进行设置为0
void* alloc_set(size_t size) {void* addr = NULL;addr = malloc(size);if (!addr) {printf("Allocating %zd MB failed\n", size / 1024 / 1024);} else {memset(addr, 0, size);}return addr;
}void add_pressure(size_t* shared, size_t size, size_t step_size, size_t duration,const char* oom_score) {int fd, ret;fd = open("/proc/self/oom_score_adj", O_WRONLY);//给进程的oom_score_adj写入相关adj值的文件ret = write(fd, oom_score, strlen(oom_score));//写人对应的oom_score到上面文件if (ret < 0) {printf("Writing oom_score_adj failed with err %s\n", strerror(errno));}close(fd);if (alloc_set(size)) {*shared = size;}
//这里会一直申请内存while (alloc_set(step_size)) {size += step_size;*shared = size;usleep(duration);//这里会有个延时1000us}
}
更多framework技术干货,请关注下面“千里马学框架”
相关文章:

lmk内存压力测试工具mem-pressure源码剖析
背景: android系统开发过程中,经常会遇到一些low memory kill的问题,在分析这些系统低内存导致被杀问题时候,经常因为不好复现而成为一个比较烦恼的阻碍。因为这种低内存问题本身就不属于一种功能操作类型的问题,属于…...

企业四要素如何用Java进行调用
一、什么是企业四要素? 企业四要素是在企业三要素(企业名称、统一社会信用代码、法定代表人姓名)的基础上,增加了一个关键要素,通常是企业注册号或企业银行账户信息。这种接口主要用于更全面的企业信息验证,…...

修剪二叉搜索树(力扣669)
这道题还是比较复杂,在递归上与之前写过的二叉树的题目都有所不同。如果当前递归到的子树的父节点不在范围中,我们根据节点数值的大小选择进行左递归还是右递归。为什么找到了不满足要求的节点之后,还要进行递归呢?因为该不满足要…...

一款由 .NET 官方团队开源的电子商务系统 - eShop
项目介绍 eShop是一款由.NET官方开源的,基于.NET Aspire构建的用于参考学习的服务架构电子商务系统,旨在展示如何利用.NET框架及其相关技术栈构建一个现代化的电子商务网站。该项目采用服务架构,将应用程序分解为多个独立的服务,…...

论最新技术编程类有什么,值得关注的点有什么呢?
在2025年的编程领域,新技术层出不穷。编程语言方面,Zig作为新一代系统级编程语言,凭借无隐藏控制流、出色的优化性能以及良好的C语言兼容性,被视作C语言强有力的替代者;Rust的应用范围不断拓展,在系统开发和Web后端开发中表现亮眼,其“零成本抽象”特性在保障内存安全的…...

Java入门进阶
文章目录 1、常用API 1.1、Math1.2、System1.3、Object1.4、Arrays1.5、基本类型包装类 1.5.1、基本类型包装类概述1.5.2、Integer1.5.3、int和String相互转换1.5.4、自动装箱和拆箱 1.6、日期类 1.6.1、Date类1.6.2、SimpleDateFormat类 1.6.2.1、格式化(从Date到…...

Java并发编程面试题:ThreadLocal(8题)
🧑 博主简介:CSDN博客专家,历代文学网(PC端可以访问:https://literature.sinhy.com/#/?__c1000,移动端可微信小程序搜索“历代文学”)总架构师,15年工作经验,精通Java编…...

Zabbix7.0安装(Ubuntu24.04+LNMP)
1.选择版本 下载Zabbix 2.安装虚拟机 这里选择在Ubuntu24.04上安装Zabbix. 安装链接https://blog.csdn.net/weixin_58189050/article/details/145446065 配置源 vim /etc/apt/sources.list deb https://mirrors.aliyun.com/ubuntu/ noble main restricted universe multive…...

从 0 到 1 构建数仓之DWD层
在企业数字化转型进程中,数据仓库的建设至关重要,而 DWD 层(明细粒度事实层)作为数据仓库的核心支撑层,其搭建质量直接影响企业数据的分析价值与决策效率。本文将结合实际案例与行业经验,详细阐述企业如何从…...

S4 HANA手工记账Tax Payable – FB41
本文主要介绍在S4 HANA OP中手工记账Tax Payable – FB41。具体请参照如下内容: 手工记账Tax Payable – FB41 该事务代码用于手工处理税码统驭科目的记账,一般税码科目需要设置为只能自动记账,因此无法手工对税码统驭科目记账,但…...

【自然语言处理(NLP)】NLP实战:IMDB影评情感分析项目
文章目录 介绍IMDB影评情感分析项目数据集项目实现1. 导包2. 加载IMDB数据3. 查看部分数据4. 分词5. 加载数据整合6. 构建模型7. 词嵌入8. 初始化模型和权重9. glove词向量10. 训练和评估11. 预测 个人主页:道友老李 欢迎加入社区:道友老李的学习社区 介…...

DIY Shell:探秘进程构建与命令解析的核心原理
个人主页:chian-ocean 文章专栏-Linux 前言: Shell(外壳)是一个操作系统的用户界面,它提供了一种方式,使得用户能够与操作系统进行交互。Shell 是用户与操作系统之间的桥梁,允许用户通过命令行…...

通过Redisson构建延时队列并实现注解式消费
目录 一、序言二、延迟队列实现1、Redisson延时消息监听注解和消息体2、Redisson延时消息发布器3、Redisson延时消息监听处理器 三、测试用例四、结语 一、序言 两个月前接了一个4万的私活,做一个线上商城小程序,在交易过程中不可避免的一个问题就是用户…...

SQL Server配置管理器无法连接到 WMI 提供程序
目录 第一步第二部 第一步 发现没有资源管理器 在文件夹找到管理器 打开发现报这个错误 配置管理器无法连接到 WMI 提供程序第二部 https://blog.csdn.net/thb369208315/article/details/126954074...

Linux内核源码:ext4 extent详解
在 Linux 系统的庞大体系中,文件系统就像是一个井然有序的图书馆,而 ext4 文件系统则是这座图书馆中极为重要的 “藏书室”,它负责高效管理和存储数据。在 ext4 众多的奥秘中,ext4 extent 犹如一颗璀璨的明珠,起着关键…...

Maven jar 包下载失败问题处理
Maven jar 包下载失败问题处理 1.配置好国内的Maven源2.重新下载3. 其他问题 1.配置好国内的Maven源 打开⾃⼰的 Idea 检测 Maven 的配置是否正确,正确的配置如下图所示: 检查项⼀共有两个: 确认右边的两个勾已经选中,如果没有请…...

自指学习:AGI的元认知突破
文章目录 引言:从模式识别到认知革命一、自指学习的理论框架1.1 自指系统的数学定义1.2 认知架构的三重反射1.3 与传统元学习的本质区别二、元认知突破的技术路径2.1 自指神经网络架构2.2 认知效能评价体系2.3 知识表示的革命三、实现突破的关键挑战3.1 认知闭环的稳定性3.2 计…...

排序算法--希尔排序
希尔排序是插入排序的改进版本,适合中等规模数据排序,性能优于简单插入排序。 // 希尔排序函数 void shellSort(int arr[], int n) {// 初始间隔(gap)为数组长度的一半,逐步缩小for (int gap n / 2; gap > 0; gap …...

Java 2024年面试总结(持续更新)
目录 最近趁着金三银四面了五六家公司吧,也整理了一些问题供大家参考一下(适合经验三年左右的)。 面试问题(答案是我自己总结的,不一定正确): 总结: 最近趁着金三银四面了五六家公…...

TensorFlow是个啥玩意?
TensorFlow是一个开源的机器学习框架,由Google开发。它可以帮助开发者构建和训练各种机器学习模型,包括神经网络和深度学习模型。TensorFlow的设计理念是使用数据流图来表示计算过程,其中节点表示数学运算,边表示数据流动。 Tens…...

不可信的搜索路径(CWE-426)
漏洞描述:程序使用关键资源时(如动态链接库、执行文件、配置文件等)没有明确的指定资源的路径,而是依赖操作系统去搜索资源,这种行为可能被攻击者利用,通过在搜索优先级较高的目录放置不良资源,…...

Linux——基础命令
$:普通用户 #:超级用户 cd 切换目录 cd 目录 (进入目录) cd ../ (返回上一级目录) cd ~ (切换到当前用户的家目录) cd - (返回上次目录) pwd 输出当前目…...

利用TensorFlow.js实现浏览器端机器学习:一个全面指南
引言 随着深度学习技术的不断发展,机器学习已从传统的服务器端运算逐渐转向了前端技术。TensorFlow.js 是 Google 推出的一个用于在浏览器中进行机器学习的开源库,它允许开发者在浏览器中直接运行机器学习模型,而无需依赖后端服务器。Tensor…...

利用HTML和css技术编写学校官网页面
目录 一,图例展示 二,代码说明 1,html部分: 【第一张图片】 【第二张图片】 【第三张图片】 2,css部分: 【第一张图片】 【第二张图片】 【第三张图片】 三,程序代码 一,…...

SpringSecurity密码编码器:使用BCrypt算法加密、自定义密码编码器
1、Spring Security 密码编码器 Spring Security 作为一个功能完备的安全性框架,一方面提供用于完成加密操作的 PasswordEncoder 组件,另一方面提供一个可以在应用程序中独立使用的密码模块。 1.1 PasswordEncoder 抽象接口 在 Spring Security 中,PasswordEncoder 接口代…...

笔记:新能源汽车零部件功率级测试怎么进行?
摘要:本文旨在梳理主机厂对新能源汽车核心零部件功率级测试需求,通过试验室的主流设备仪器集成,快速实现试验方案搭建,并体现测试测量方案的时效性、便捷性优势。目标是通过提升实现设备的有效集成能力、实现多设备测试过程的有效协同、流程化测试,可快速采集、分析当前数…...

ES6中的map和原生的对象有什么区别?
在 ES6 中,Map 和原生的对象(Object)都是用来存储键值对数据的集合,但它们有显著的区别。以下是它们之间的主要区别: 1. 键的类型 Object: 只允许使用字符串或符号作为键。其他类型的键(如数字或对象&…...

2502vim,vim文本对象中文文档
介绍 文本块用户(textobj-user)是一个可帮助你毫不费力地创建自己的文本对象的Vim插件. 因为有许多陷阱需要处理,很难创建文本对象.此插件隐藏了此类细节,并提供了声明式定义文本对象的方法. 你可用正则式来定义简单的文本对象,或使用函数来定义复杂的文本对象.如… 文本对…...

spring security与gateway结合进行网关鉴权和授权
在Spring Cloud Gateway中集成Spring Security 6以实现鉴权和认证工作,可以在网关代理层完成权限校验和认证。这种架构通常被称为“边缘安全”或“API网关安全”,它允许你在请求到达后端服务之前进行集中式的安全控制。 以下是如何配置Spring Cloud Gat…...

LabVIEW在电机自动化生产线中的实时数据采集与生产过程监控
在电机自动化生产线中,实时数据采集与生产过程监控是确保生产效率和产品质量的重要环节。LabVIEW作为一种强大的图形化编程平台,可以有效实现数据采集、实时监控和自动化控制。详细探讨如何利用LabVIEW实现这一目标,包括硬件选择、软件架构设…...