【MIG专项测试组】实战分析:内存突增是为神马?

minio分布式解决方案 minio 阅读详情

应用版本升级后使用内存突增?如何跟踪?这次MIG专项测试组为大家分享内存问题跟踪实战过程!


MIG专项测试组

致力于为腾讯移动互联网事业群(MIG)提供专项评测及深度优化(性能、功能、安全等);同时负责探索新的测试理论和方法,研发评测工具及基础组件。


背景

手机管家从4.4升级到4.5后,用户数据反馈待机内存出现了2-4M左右的增长。经过代码排查及MAT分析,发现有几处代码会导致内存增长,只要将这些代码屏蔽掉一部分,内存情况就下降到正常水平。

奇怪的是这些代码在使用过程中分配的内存并不多,只有上百K,甚至有些地方是基本不需要分配内存,但为什么会导致2-4M的内存增长?


初步分析

我们观察了不同版本的meminfo的区别,发现内存的主要增长点是Dalivk部分:


从上图可以看到,在Heap Alloc增长273K的情况下,Pss有1M的增长。从HeapFree看出大部分增长的内存是空闲的,而且经过较长时间待机后也没有被释放回系统。

对于Dalvik内存问题,通常先使用MAT辅助分析原因,要关注的有以下几项:

·        使用bitmap插件查看是否有多余的图片没有释放

·        查找占大块内存较多的对象

·        查找其它不需要的对象造成的内存泄漏

·        结合代码改动,进行缩减build,统计新代码消耗的内存

经过MAT及缩减编译分析后,基本可以确定是新代码消耗了内存。但却没有发现有明显内存泄漏的地方,而且代码经过review也没有发现问题。
这个结果让我们陷入了困惑,常用的方法找不出问题,说明有更深层次的原因。接下来要从更底层的DVM虚拟机寻找问题。


Dalvik Heap内部是如何分配和释放内存的?

为了弄清楚为什么DVM占着内存不释放,我们阅读了DVM分配内存部分的代码。代码位置在Android源码的dalvik/vm/alloc下,约255K。分析出的主要流程如下。


1、DVM使用mmap/sbrk从系统分配大块内存作为Java Heap。根据系统机制,如果分类的内存尚未真正使用,就不计入PrivateDirty和PSS。

例如下图,Heap Size/Alloc很多,但大部分是共享,实际使用的较少。所以反映到PrivateDirty/PSS里的内存并不多。



2、New对象之后,由于要向对应的地址写入数据,内核开始真正分配该地址对应的4K物理内存页面。

Alloc.cpp,176行:



3、运行一段时间后,开始GC,有些对象被回收了,有些会一直存在。



4、在GC时,有可能会进行trim。即将空闲的物理页面释放回系统,表现为PrivateDirty/PSS下降。

HeapSource.cpp,431行和1304行:


释放时是以4K物理页面为单位:



问题所在

在了解DVM分配释放内存的机制后,根据meminfo观察到的现象,猜测可能出现了页利用率问题(页内碎片)。如下图所示,

第一行:在开始阶段,内存分配的较满。
第二行:经过GC后,大部分对象被释放,少部分留下来。



这种情况下可能会产生的问题是,整页的4K内存中可能只有一个小对象,但统计PrivateDirty/PSS时还是按4K计算。


在通常的jvm虚拟机中,有CompactingGC机制,整理内存对象,将散布的内存移动到一起。
但根据DVM的代码,DVM的Mark-Sweep算法不能移动对象,即没有内存整理功能,这种情况下就会形成内存空洞。


在猜测了可能的问题后,需要验证是否如猜测原因所致,为此我们需要获取dvm虚拟机的底层内存分配数据,然后按每个物理页面统计所有对象的大小。
在阅读代码的过程中,发现DVM有个内部函数能够遍历所有的内存块,正好能实现我们的需求。
HeapSource.h,161行:



接下来的工作就是想办法在native层调用dvmHeapSourceWalk函数,并将我们的回调函数传进去。回调函数记录下来每块内存的地址和大小,保存下来的数据是这样的:

page_start_addr;chunk_start_addr;chunk_end_addr;object_size;chunk_size
41708000;1097891848;1097892056;208;212
41708000;1097892064;1097892320;256;260
41708000;1097892328;1097892488;160;164
41708000;1097892496;1097892656;160;164
41708000;1097892664;1097892968;304;308
41708000;1097892976;1097893136;160;164


再将这些数据按4K页面的范围进行累加,统计每个4K页面的使用率,做出直方图。


由此可见,4.5版本相比以前,不满的页面变多了。这就会造成开头说的现象,Heap Free和PSS都增加,很长时间也不会释放。


找到问题代码

为了找到出问题的代码,我们在上一步得到的数据上继续处理。取出所有使用不满2K的页面的内存块地址,再使用OQL将地址导入到MAT中,分析地址对应的对象是什么。



对上图得到的对象实例计算dominators。



在这里基本就能看出来是哪些对象造成了内存的碎片化。
通过对生成这些对象的代码分析和模拟实验,还原出基本的过程:

·        生成对象过程需要较多的临时变量

·        批量生成过程中,由于还有空闲内存,虚拟机没有做GC

·        完成后才进行GC,清除了所有的零时变量,留下碎片化的内存


下图是模拟这个过程的代码,执行这段代码将会在内存中形成很多碎片,造成很高的PSS占用。



总结

·        最好不要在循环中申请很多内存和创建很多临时变量;

·        生成缓存的事,可以慢慢做,也可以按需缓存;

·        MAT不是万能的,比如这次的数据隐藏在每个对象的地址中;

·        了解Linux系统内核对Android测试有帮助;

·        内存分配的最小单位是页面,通常为4K;

·        对于难缠问题,有必要从底层了解运作机制。


小编有话说

除了在微信公众号为大家定期分享移动质量分析干货外,腾讯Bugly最近开始筹办移动开发者沙龙活动,希望与更多的移动开发者进行面对面交流。

腾讯Bugly移动开发者沙龙

第一期 移动应用性能优化笔记 北京站
时间:2015年5月31日(周日)14:00 -18:00
地点:北京市海淀区 中关村创业大街 车库咖啡
活动现正火热报名中,欢迎大家报名参加!
点击这里,即可了解腾讯Bugly移动开发者沙龙活动详情,进行报名。


本文系腾讯Bugly特邀文章,转载请注明作者和出处“腾讯Bugly(http://bugly.qq.com)”

滴滴云A100 40G 性能测试 V100陪练! 眼看游戏卡RTX3080 发售在即,我终于等到了滴滴云(感谢)A100的测试机会。因为新卡比较紧张,一直在排队中,直到昨天才拿了半张A100...今天终于上手了单张40G的A100,小激动,小激动,小激动!!!基于安培架构的最新一代卡皇(NVIDIA GPU A100 Ampere)可以搞起来了。 Part 1:系统环境 A100正处于内存阶段,官网上还看不到。内测通过ssh连接,ssh连上去之后大概看了下系统环境。 操作系统,CPU,RAM数据如上。重点关注GPU:A100-SXM4-40GB. 阅读详情

相关推荐

FPGA 学习笔记:Vivado 2020.2 MicroBlaze MIG 测试 DDR3 篇三

FPGA 学习笔记:Vivado 2020.2 MicroBlaze MIG 测试 DDR3 篇三

坚韧与专注 2005

彻底解决存储膨胀:MinIO重复数据删除技术全解析

企业存储系统中,重复数据占比高达30%-50%已成为常态。据IDC统计,未实施去重的对象存储每年将多消耗40%的存储成本,而MinIO作为高性能对象存储的代表,其原生去重能力可直接将存储需求降低60%以上。本文将系统讲解MinIO数据去重的实现原理、部署策略和性能优化,帮助你构建高效经济的存储架构。 ## MinIO重复数据删除技术架构 ### 核心工作原理 MinIO采用基于内容的去重机制...

gitblog_00627的博客 957

从Gitee上部署视觉工程到Linux虚拟机

(使用SVM来识别装甲板的编号,此处手机上的图片中只有灯条没有数字,SVM无法识别出编号。这两行代码的意义是,当SVM识别不出或者识别不到编号时,把装甲板的编号默认为2号。找到自瞄程序中,数字识别类下的这两行代码,把注释去掉。这样,每次打开新的终端时,环境变量都会自动设置。(2)查看虚拟机设置选项,检查虚拟机USB接口是否为3.0及以上的接口。如果不是,要更改好。这样,每次打开新的终端时,环境变量都会自动设置。后,每次打开终端时自动设置这些环境变量,你可以将。打开第一个终端,用来挂ROS的内核启动页面。

2301_81035291的博客 1520

6.23

6.23 一周工作问题小计

weixin_58748174的博客 1536

动手学Moveit2 | 运行配置好的机械臂功能demo

通过这个小demo你可以直观的感受moveit2的强大,但还有很多需要我们探索的,比如机械臂是如何规划的,规划的过程中如何结合环境信息,规划的时候机械臂如何求解,如何和真实的机械臂对接等等,这些都需要你来进一步探索,今天就到这里,明天给大家秀一下小仙女焊的fishbot运控板。

生活不止眼前的苟且 8879

NVIDIA NCCL 安装和测试实战教程

ibrary)是用于深度学习应用的高性能通信库,可加速多GPU通信和同步。它能够在多个GPU之间进行高效的数据传输和集体操作,显著提高了分布式GPU系统上深度学习训练和推理的性能。NVIDIA NCCL是加速多GPU系统上深度学习应用的必不可少的工具。其高效的通信原语和集体操作显著提高了分布式训练和推理的性能,使其成为现代深度学习基础架构的关键组成部分。

weixin_39818775的博客 4428

MinIO内存管理机制解析与最佳实践

MinIO作为高性能对象存储服务,其内存管理机制与传统应用有所不同。在实际部署中,用户经常观察到MinIO实例的内存使用量会持续增长,直至接近Pod设置的内存限制。这种现象并非内存泄漏,而是MinIO主动利用可用内存来优化性能的预期行为。 ## 内存管理设计原理 MinIO采用主动内存利用策略,其核心设计理念是"可用即使用"。系统会将空闲内存用于以下关键功能: 1. **读写缓存加速**:活...

gitblog_01189的博客 438

vue引入使用腾讯地图

// 引入鹅厂地图 initMap(lat = 0.0000000, lng = 0.0000000) { // 定义地图中心点坐标- var center = new TMap.LatLng(lat, lng) // 定义map变量,调用 TMap.Map() 构造函数创建地图 map = new TMap.Map(document.getElementById('txMapBox'), { center: center, // 设.

LiangRZ 4536

MinIO服务器内存分配问题分析与解决方案

在MinIO存储系统的使用过程中,部分用户报告了内存分配错误导致Web控制台无法访问的问题。该问题主要出现在从2021版本升级到2024版本后,系统日志中会出现"cannot allocate memory"的错误提示,即使服务器实际可用内存充足(如10GB空闲)。 ## 技术分析 ### 错误现象 系统日志中典型的错误表现为: ``` Error: cannot allocate memo...

gitblog_00093的博客 689

吉林大学2016级唐班c语言期末考试B卷

` #include<stdio.h> #include<stdlib.h> //双指针法,每次从a,b中选一个最大的数,从后向前一次放在数组a中 int merge(int *a,int m,int *b,int n){ int i=m-1,j=n-1,k=m+n-1; while(i>=0&&j>=0){ if(a[i]>b[j])a[...

weixin_42339173的博客 1195

shader基于高度的权重混合

效果图: 基于高度的权重混合 , 效果描述: (1)混合:三层混合, 例如 第一层是草,第二层是石头,第三层是沙子,三者混合显示 (2)权重: 三层的权重的和 为1, 三者是此消彼长的关系 (3)高度:高度会限制或者说是 束缚 着 效果 关于混合,再多说几句: (1)基于权重的混合:权重 ,跟顺序没有关系 只跟权重的大小有关系(在一层一层界限不清晰的地方,特别适用!!效果极好!!!!) (2)基于叠加的混合: 叠加 就是 一层一层的往上加。。。。 所以顺序特别重要(在雪地等效果中使用:因为

木马人 1117

《MinIO Linux 安装后性能优化:内存分配与存储策略调整》

在 Linux 系统上安装 MinIO 后,默认配置可能无法充分发挥硬件潜力,尤其在内存分配和存储策略方面。通过内存分配优化(调整 Go GC 和系统参数)和存储策略调整(文件系统设置、erasure coding 配置),MinIO 在 Linux 上的性能可显著提升。在 Linux 上,GC 行为受系统内存设置影响,不当配置会导致性能下降。:在 8GB RAM 系统测试,读写延迟降低 20%,吞吐量提升 15%。:在 NVMe SSD 测试,随机读写 IOPS 提升 30%,延迟降低 25%。

2501_93897010的博客 485

【DRAM存储器六十二】DDR5介绍--引脚和基本功能简介

详述DDR5与DDR4的引脚区别和DDR5基本功能

highman110的博客 523

安卓专项测试之内存及PerfDog和SoloPi比较

这次继续安卓专项测试之内存 Android系统中每个APP占内存会有私有和公共的两部分:ShareDirty、PrivateDirty。“PrivateDirty”内存是其最重要的部分,因为只被自己的进程使用。它只在内存中存储,因此不能做分页存储到外存(Android不支持swap)。所有分配的Dalvik堆和本地堆都是“private dirty”内存;Dalvik堆和本地堆中和Zygote进程共享的部分是共享dirty内存。 而Pss是另一种应用内存使用的计算方式,是把跨进程的共享页也计算在内 — 例如

fzxwl的博客 2646

[dprecated]第五章:TTM分析: 5.1 TTM设计目标和核心概念

TTM是Linux DRM框架下的通用显存管理模块,其复杂性源于需要满足多样化的显存管理需求。该文解析了TTM的核心结构体及其关系:ttm_device作为顶层管理者,包含多个ttm_resource_manager处理不同类型内存;ttm_buffer_object为核心对象,通过ttm_resource关联物理资源;其他组件如ttm_tt管理页表、ttm_pool优化分配效率。文章强调理解这些结构体关系是掌握TTM机制的基础,并建议国产芯片开发者参考这些功能需求。

图形/计算GPU的驱动与虚拟化技术分享园地 2121

TMS_WebGMaps_1.9.8.0_Full_Source

TMS_WebGMaps_1.9.8.0_Full_Source 全源码 delphi cbuilder

【Minio-优化浅谈】

Minio

分享大数据、java相关的技术 3409

Outlook Express 6 (OE6) for Win7/Win8/Win10

英文版 Outlook Express6.0, 兼容Win7/Win10/WinXP,解压就可用。

【MIG专项测试组】如何准确评测Android应用的流畅度?

叶方正,2008年加入腾讯,就职于无线研发部【专项测试组】。曾经负责多个产品的性能优化工作,积累大量的移动终端平台优化以及评测经验。 怎样获取SM值? 前文我们分析了通过测量应用的帧率FPS并不能准确评价App的流畅度(如何量化Android应用的“卡”?流畅度原理&定义篇),FPS较低并不能代表当前App在UI上界面不流畅,而1s内VSync这个Loop运行了

腾讯Bugly的专栏 1969

温度PID控制PLC程序

温度PID稳定控制程序,适用于欧姆龙PLC,对其他PLC也具有很大参考价值

计算机控制技术及应用

《计算机控制技术及应用》通过总结作者的科研成果和吸收国内外的先进理论、方法和技术,以计算机控制系统的网络化、开放化、智能化和集成化发展趋势为主线索,主要介绍计算机控制系统的基本概念和计算机控制系统的典型形式,计算机控制系统的数学描述与基本分析方法,以及数字PID控制器、最少拍控制系统、达林算法、状态变量设计法等设计方法及其各种改进算法。重点突出计算机控制系统输入输出通道接口的设计方法和典型控制系统的设计案例与实现方法等。

【MIG专项测试组】如何量化Android应用的“卡”?—流畅度原理&定义篇

腾讯Bugly特邀鹅厂MIG专项测试组,分享移动应用质量的有效评估方法。 MIG专项测试组 致力于为腾讯移动互联网事业群(MIG)提供专项评测及深度优化(性能、功能、安全等);同时负责探索新的测试理论和方法,研发评测工具及基础组件。 背景 在手机App竞争越来越激烈的今天,Android App的各项性能,如CPU、内存消耗等都有了客观的衡量指标。但对于

先疯盗骨 920

【转】Android APP性能及专项测试(个人整理)

转载地址:https://www.zybuluo.com/defias/note/592309 Android篇 1. 性能测试 Android性能测试分为两类:1、一类为rom版本(系统)的性能测试2、一类为应用app的性能测试 Android的app性能测试包括的测试项比如:1、资源消耗2、内存泄露3、电量功耗4、耗时5、网络流量消耗6、移动终...

weixin_30808253的博客 5156

mats测试所有显存命令_滴滴云A100 40G 性能测试 V100陪练!

眼看游戏卡RTX3080 发售在即,我终于等到了滴滴云(感谢)A100的测试机会。因为新卡比较紧张,一直在排队中,直到昨天才拿了半张A100...今天终于上手了单张40G的A100,小激动,小激动,小激动!!!基于安培架构的最新一代卡皇(NVIDIA GPU A100 Ampere)可以搞起来了。Part 1:系统环境A100正处于内存阶段,官网上还看不到。内测通过ssh连接,ssh连上去之后大概...

weixin_40003046的博客 6818

写给新入行的测试组同事

    跟七年前的我一样,今天大家应该都怀着一种特殊的心情,因为从今天开始,大家就是一名新员工了,这是大家的第一份正式工作,也是人生的一个起点。    首先想说说该怎样对待测试工作。我想纠正一下大家的一个观点,这个观点也是很多同事的想法,那就是测试工作是软件公司中最容易做的一个工作,认为测试就是把开发人员做好的软件走马观花似的看一遍,随便输入几条数据看看程序有没有出错而已。这个观点不对,我觉得如同

pbMaster的专栏 2932

MIG IP控制DDR3读写测试

本文设计思想采用明德扬至简设计法。在高速信号处理场合下,很短时间内就要缓存大量的数据,这时片内存储资源已经远远不够了。DDR SDRAM因其极高的性价比几乎是每一款中高档FPGA开发板的首选外部存储芯片。DDR操作时序非常复杂,之所以在FPGA开发中用途如此广泛,都要得意于MIG IP核。网上关于MIG控制DDR的资料很多,因此本文只讲述个人认为较重要的内容。由于MIG IP核用户接口时序较复杂,...

hhpingyear的博客 6311
上一篇: 全系统栈崩溃是什么鬼?腾讯手机管家高级工程师jaylin,教你如何抓鬼!
下一篇: 【移动开发者沙龙 北京站】第一期 移动应用性能优化笔记 火热报名中
腾讯Bugly
博客等级 码龄12年 1875粉丝 201原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值