linux进程实际内存大小,Linux进程内存用量分析之堆内存篇

本文将介绍几种内存泄漏检测工具,并通过实际例子介绍一种分析堆内存占用量的工具和方法,帮助定位内存膨胀问题。背景

进程的内存管理是每一个开发者必须要考虑的问题,对于C++程序进程来说,出现问题很多情况下都与内存挂钩。进程崩溃问题通常可以使用gdb等调试工具轻松排查并解决。而对于进程内存膨胀这类问题,原因通常有三个:

1.内存泄漏。

2.分配器管理的空闲内存较多而造成的内存空洞。

3.有未统计使用的未知内存占用。

内存泄漏问题可以使用一些工具来检测。但是对于后两种问题,却一直没有比较通用的方法去确定。本文将介绍几种内存泄漏检测工具,并通过实际例子介绍一种分析堆内存占用量的工具和方法,帮助定位内存膨胀问题。常见内存问题的分析方法

对于内存泄露问题,目前已经有较成熟的工具进行检测,这里简单介绍两个工具:AddressSanitizer和Valgrind。

AddressSanitizer是google开源项目,可以用来检测内存泄漏和其他导致进程崩溃的内存问题。它的优势在于造成的额外CPU占用很小,但是需要重新编译项目,并且在编译的时候添加-fsanitize=address选项。在程序运行时如果有任何内存问题,就会终止进程并且打印出详细的错误信息。如果进程存在内存泄漏会在进程结束后,打印出所有泄漏的内存大小和申请这块内存的调用栈,如下图所示:

AddressSanitizer检测内存泄漏

另一个工具Valgrind的优势在于不需要重新编译,只需要在运行时加上valgrind --leak-check=yes即可。但是它的额外CPU开销会更大,大约是AddressSanitizer的十倍,功能上也不及AddressSanitizer完善。下表是两种工具功能和性能的比较:

AddressSanitizer与Valgrind对比

这两种工具不光能够检测内存泄漏,对于堆栈溢出等问题也有比较好的效果。对于这两个工具更具体的介绍可以参照官方的使用文档:

AddressSanitizer:https://github.com/google/sanitizers/wiki/AddressSanitizer

Valgrind:

而对于后两种原因,我们需要根据不同的分配器区别看待。常见的分配器有glibc默认的ptmalloc,google维护的tcmalloc以及facebook维护的jemalloc等。后两者都自带了内存分析工具(Heap Profiler),可以检测内存泄漏,也可以打印出详细的内存分配情况,对上述三个问题都有比较完善的排查方法,有兴趣可以查看官方文档,都讲得比较详细,这里不再介绍。而glibc默认的ptmalloc却不自带这样的工具,一种排查方法是去了解ptmalloc的实现和结构以后编写程序或者gdb脚本去分析进程的内存结构,我们接下来要介绍的一种内存分析工具就是以这种方法实现的。针对ptmalloc的堆内存内用分析1.环境

58自研的搜索引擎Esearch底层使用C++实现。Esearch在内存管理方面针对不同的场景会有不同的策略。对于对象生命周期有规律,高频分配的场景,Esearch实现了定制的内存池进行管理,并且这些内存都会在日志中统计占用量。而对于对象生命周期不确定,大小不确定的场景,内存池的代价可能高于通用分配器(new/malloc),所以直接使用通用内存分配器来分配。

对于通用分配器的选择,目前Esearch使用的是glibc2.12环境下默认的ptmalloc。之所以未使用tcmalloc或者jemalloc是因为经测试后发现后两者在常见场景下内存占用比ptmalloc要高,而且Esearch中对于内存分配热点已经使用了定制内存池,后两种分配器的优势其实并不明显。对于Ptmalloc完整结构的介绍可以阅读源码或者参阅华庭的《glibc内存管理ptmalloc2源代码分析》,这里只在用到时阐述一下原理,不做过多的介绍。

接下来我们通过一个例子来了解如何分析堆内存的用量。现在有一个realtime_searcher进程如下:

运行中的realtime_searcher进程

可见进程占用总物理内存27G,其中SHR内存占用18G,剩下的物理内存 约9G。

2.工具介绍

这里介绍一个非常强大的内存分析工具——core_analyzer。这是一个基 于core文件的内存分析工具,由Michael Yan开发和维护并且开源在github上。利用它可以对glibc层的ptmalloc结构进行分析,还原进程真实的内存结构。目前core_analyzer支持的glibc2.3,2.4,2.5,2.12-2.23版本下的ptmalloc实现,这些版本对应的ptmalloc结构其实都大同小异。

Core_analyzer工具提供了以下功能:

Core_analyzer用户界面

[0] 打印core文件的基本信息,包括各个线程的信息,和内存段的信息等。

[1] 水平搜索对象的引用

[2] 垂直搜索对象的引用链,直到找到符号表中有调试信息的对象。

[3] 打印线程共享对象

[4] 打印给定地址段的内容

[5] 通过地址查询所属chunk

[6] 打印所给的地址周围的页(意义不明)

[7] 打印整个堆的结构。该结构能够与ptmalloc的结构相对应

[8]、[9]都是打印前N大的chunk,[9]还顺便打印出引用链

[10] 根据它的名字为内存泄漏检测,但实际使用发现不仅耗时而且不正确

[11] 退出

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

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

相关文章

spring处理循环依赖时序图_Maven依赖管理系统

【思考】首先,简单讲述一下为什么需要这样一个系统?不知道大家有没有思考,在一个可能有上千个模块/产品的公司,对于模块之间有较多相互依赖的情况,以下问题该如何解决:我们把一个生命周期结束的组件移除之后…

好友消息和群消息区别

好友消息类型&#xff1a;$message is 空军建军节群消息类型: $message is 33623fd04e4001687be9b5d85b1e2958950adc947c2398c59225d8904ff98bea:<br/>hhhgf转载于:https://www.cnblogs.com/zhaoyangjian724/p/6200407.html

linux入门命令菜鸟,经典:Linux菜鸟入门级命令大全

经典&#xff1a;Linux菜鸟入门级命令大全1. man 对你熟悉或不熟悉的命令提供帮助解释eg:man ls 就可以查看ls相关的用法注&#xff1a;按q键或者ctrlc退出&#xff0c;在linux下可以使用ctrlc终止当前程序运行。2. ls 查看目录或者文件的属*&#xff0c;列举出任一目录下面的文…

java 获取本机ip_linux获取本机IP

获取网口名称直接输出所有的网口信息ifconfig | grep -v ^ | grep -v ^bashifconfig | awk -F: /^[^ ]/{print$1}ip a | awk -F": " /^[^ ]/{print$2}获取所有的IP直接输出所有的IPifconfig | grep inet | awk {print $2}ip a | awk /inet /{print$2} | sed s#/.*#…

python语言基本控制结构有哪些-以下不属于Python语言控制结构的是()

【单选题】以下程序的输出结果是() x10 y0 if(x>5)or(x/y>5): print("Right") else: print("Wrong")(1.0分) 【单选题】以下代码的输出结果是() def young(age): if 25<age<30: print("年轻有前途") elif age<25: print("参…

手持移动扫描终端 PDA移动开单系统-批发零售管理

条码数据采集器通过扫描商品条码移动开单&#xff0c;实现便携式办公&#xff0c;伴随式销售&#xff0c;是我公司的一款最新便携式开单配套产品&#xff0c;采集器能通过WIFI无线局域网、GPRS互联网直接与主机连接&#xff0c;让公司业务人员能随时随地了解公司产品信息&#…

Linux 把文件内容发送给用户,linux上给其他在线用户发送信息(wall, write, talk, mesg)...

linux上给其他在线用户发送信息(wall, write, talk, mesg)2018-11-30设置登录提示/etc/motd文件的用途/etc/motd即message of today(布告栏信息)&#xff0c;每次用户登录时&#xff0c;/etc/motd文件的内容会显示在用户的终端。系统管理员可以在文件中编辑系统活动消息&#x…

sd卡测速工具_拍完照回家发现SD卡损坏,拯救你的照片就用这个办法!

SD卡可以说是目前相机存储的主要工具&#xff0c;一旦拍照结束后出了问题&#xff0c;那可是最头疼的事情。我昨天就碰到了这样奇怪的事情&#xff0c;拍照回来正要导出数据&#xff0c;发现电脑系统提示要格式化存储卡&#xff0c;经过几次插拔发现依然不能识别。如果按照提示…

linux中vim如何替换字符串,vim中替换字符串的方法有哪些

vim中替换字符串的方法有哪些发布时间&#xff1a;2020-06-04 11:41:18来源&#xff1a;亿速云阅读&#xff1a;238作者&#xff1a;Leah这篇文章为大家带来有关vim中替换字符串的方法介绍&#xff0c;如果在日常学习或工作遇到这个问题&#xff0c;希望大家通过这篇文章的几种…

ELK Stack (1) —— ELK + Redis安装

ELK Stack (1) —— ELK Redis安装 摘要 安装Elasticsearch、Logstash、Kibana与Redis以实现一个日志收集平台 版本 elasticsearch版本: elasticsearch-2.2.0 logstash版本: logstash-2.2.2 kibana版本: kibana-4.3.1-darwin-x64 jdk版本: jdk1.8.0_65 内容 目标架构 Logstash…

智能机器人路径规划及代码_AI割草机器人用ML+传感器自动规划路径

作者&#xff1a;DIGITIMES谢明珊Graze Mowing发表全新自动割草机器人&#xff0c;可针对中大型商用空间提高景观维护效率&#xff0c;吸引来自世界各地的高尔夫球场以及景观维护公司的询问&#xff0c;已累积1,900多万美元预购订单和商业合约&#xff0c;可望为劳力密集的造景…

request.get... getHeader 能取得的信息 参数

转载▼StringTokenizer st new StringTokenizer(agent,";"); st.nextToken(); //得到用户的浏览器名 String userbrowser st.nextToken(); System.out.println(userbrowser); //得到用户的操作系统名 String useros st.nextToken(); System.out.println(useros)…

同一个浏览器打开不同端口的程序登录_【BI报表制作】单点登录与个性化开发...

无法正常登录&#xff1f;想将报表内默认的奥威BI软件logo换成自己家的&#xff1f;想连接Excel数据源做可视化&#xff1f;想实现单点登录&#xff08;公开分享&#xff09;&#xff1f;本期的实用课程OurwayBI单点登录与个性化开发可不要错过了。修改端口奥威BI软件默认的端口…

linux使用u盘的过程是,图文详解Linux下使用U盘的方法

习惯了在Windows系统下即插即用U盘&#xff0c;换成Linux系统下你可能就不会使用了。为什么这么说呢?因为Linux系统U盘被视为SCSI设备&#xff0c;因此不能直接使用&#xff0c;还需要我们手动进行相应的设置&#xff0c;下面这篇教程就专门为第一次在Linux下使用U盘的朋友们而…

打印机怎么扫描到电脑_【柯美C360扫描怎么用教程】打印机怎么扫描

【C360扫描怎么用教程】打印机怎么扫描各个品牌的复印机的扫描功能使用方法大同小异&#xff0c;主要步骤就是将扫描原件放置好&#xff0c;选择单面或双面、文件类型、清晰度等&#xff0c;然后按开始就可以扫描了&#xff0c;下面广州柯镁办公设备以柯尼卡美能达复印机C360/C…

自己做站点(一) 从头至尾实现一个企业站的速成

网上随便搜一下。就会发现“xx天学会站点设计”的教程数不胜数&#xff0c;这就说明站点开发并不像非常多人觉得的那么难&#xff0c;从今天開始跟大家一起完毕一个企业站的搭建以及域名申请以及上线的所有过程&#xff0c;希望对大家有所帮助。终于的效果如这个站点所看到的。…

代码证年检所需资料_上海注销小规模公司所需材料及流程

大多数企业分类为&#xff1a;一般人和小规模。公司经营当中如果遇到问题&#xff0c;不再经营的时候&#xff0c;可选择注销。但是&#xff0c;一般人公司注销和小规模注销又有些许的不同。申与城企业擅长各种公司注销。今天就和大家聊一聊新小规模公司注销流程&#xff0c;以…

linux 多个select,Linux select()和多个套接字的FIFO排序?

您可以使用IP_PKTINFO获取数据包发送到的多播组的地址 - 即使套接字订阅了一堆多播组。有了这个&#xff0c;您将按顺序获取数据包并按组地址过滤。请参阅以下示例&#xff1a;#include #include #include #include #include #include #include #include #include #include #in…

Python爬虫实战(5):模拟登录淘宝并获取所有订单(1)

经过多次尝试&#xff0c;模拟登录淘宝终于成功了&#xff0c;实在是不容易&#xff0c;淘宝的登录加密和验证太复杂了&#xff0c;煞费苦心&#xff0c;在此写出来和大家一起分享&#xff0c;希望大家支持。 本篇内容 1. python模拟登录淘宝网页 2. 获取登录用户的所有订单详情…

python逻辑流程图_python-程序流程图

原博文 2020-06-03 12:24 − 程序流程图 1、流程图的基本要素&#xff1a; 表示相应操作的框 带箭头的流程线 框内外必要的文字说明 起止框 判断...01055 相关推荐 2019-09-28 21:13 − Python python是一种跨平台的计算机程序设计语言&#xff0c;是一种面向对象的动态类型语言…