首页 > 编程语言 >如何寻找 C++ 程序中的大对象?

如何寻找 C++ 程序中的大对象?

时间:2023-06-15 14:02:10浏览次数:35  
标签:chunkserver 对象 程序 寻找 C++ merge gdb mergeserver txt


问题背景

大型应用程序中包含成千上万个 C++ 对象,这些对象大小如何?有没有一些大对象很废?例如,在 OceanBase 0.4 开源版本中 Top 10 的大对象,最大的一个占 58MB 内存:

排序 大小  类名 
1 58,720,304 rootserver::ObRootTable2 
2 20,163,008 updateserver::ObUpdateServerMain 
3 20,153,152 updateserver::ObUpdateServer 
4 18,761,432 common::ObMergerSchemaManager 
5 16,778,576 updateserver::ObUpsSlaveMgr 
6 8,147,136 chunkserver::ObChunkServerMain 
7 8,142,344 chunkserver::ObChunkServer 
8 7,513,576 chunkserver::ObChunkMerge 
9 7,492,928 chunkserver::ObTabletMergerV2 
10 6,308,720 mergeserver::ObMergerGetRequest

统计方法

下面以 debug 模式编译的 mergeserver 中的对象统计为例说明统计方法

nm mergeserver | grep  " V _ZTIN9" | awk '{ printf "%s\n", $3}' | c++filt |  awk '{ printf "%s\n", $3}' | sed '/</d' | awk '{printf "p sizeof(%s)\n", $1}' > t_merge.txt

利用gdb脚本计算sizeof:

$gdb mergeserver
(gdb) set logging on
(gdb) set logging file r_merge.txt
(gdb) source t_merge.txt

将输出导入到 r_merge.txt,如果遇到部分对象找不到,打开 t_merge.txt 稍微编辑一下,删掉对应对象,重新 source t_merge.txt。

生成结果报告

paste r_merge.txt t_merge.txt | awk '{printf "%s %s\n", $3, $5}' > merge.txt

最后,把 merge.txt 导入到 excel 做一下排序,搞定。


标签:chunkserver,对象,程序,寻找,C++,merge,gdb,mergeserver,txt
From: https://blog.51cto.com/u_16162111/6486736

相关文章

  • C++ 文件和流
     到目前为止,我们已经使用了 iostream 标准库,它提供了 cin 和 cout 方法分别用于从标准输入读取流和向标准输出写入流。本教程介绍如何从文件读取流和向文件写入流。这就需要用到C++中另一个标准库 fstream,它定义了三个新的数据类型:数据类型描述ofstream该数据类......
  • 浅析H5页面跳转小程序的3种实现方案
    经常会有这样的场景:用户在网页中一键唤起小程序,能够给用户提供更好的体验。实现H5跳转小程序的方案目前有多种,可以根据自己的实际场景选择。第一种:通过URLScheme适合在外部浏览器运行的H5页面,通过URLScheme的方式来拉起微信打开指定小程序。那如何获取小程序......
  • 租赁小程序开发|人车网租赁系统搭建|租赁电商小程序开发功能
    当人们想要出租物品的时候往往是通过互联网平台来实现的,以前都是通过分类信息网站,但是线下中介很多,差别也很大,大多数人都不知道怎么选择。为了给人们租赁物品提供方便,有必要开发一个租赁小程序。那么在开发租赁小程序的时候要设计哪些功能呢?接下来小编就给大家介绍下。人车网租赁软......
  • C/C++商品信息管理系统[2023-06-15]
    C/C++商品信息管理系统[2023-06-15]选题4商品信息管理系统的设计与实现设计要求本课题要求同学们完成一个信息管理类的课题---《商品信息管理系统》,能够对商品信息进行有效的管理,实现商品信息查询、商品销售、商品进货、商品销售信息统计等方面的基本操作。管理内容(商品信息......
  • uniapp 打包发布小程序的流程指引
    用uniapp开发小程序其实和开发H5是一样的。就是在打包的时候会略有不同。uniapp在开发的时候需要在 manifest.json的源码视图配置nginx反向代理才能去请求后端`/代理名称${config.url}`一般情况下的请求都是代理+url去请求数据。但是,这个只是针对H5的请求方式......
  • c++ mutex
    mutex直译为互斥量。使用它可以做到:一份共享数据,同时只能由一个线程访问,在此基础上会衍生很多很方便的api,通过mutex将共享数据的访问变成互斥操作,避免与时间相关的错误简单结论及定义:1.每个线程在对资源操作前都尝试先加锁,加锁成功才能操作,操作结束就解锁 2. ......
  • 新方法学C++之编程范式
    C++属于多编程范式语言:过程编程、结构化编程、面向对象编程、泛式编程、函数式编程。过程编程:类似于汇编语言结构化编程:类似C语言,把分支测试等做成了结构化面向对象编程:按解决问题的方式来编程泛式编程:解决代码可复用的问题函数式编程:类似于lisp编程语言......
  • C++ 数值最大最小标识符一网打尽,INT_MIN/ INT_MAX/LONG_MIN/LONG_MAX 等等
    ConstantMeaningValueCHAR_BIT Numberofbitsinthesmallestvariablethatisnotabitfield. 8SCHAR_MIN Minimumvalueforavariableoftypesignedchar. -128SCHAR_MAX Maximumvalueforavariableoftypesignedchar. 127UCHAR_MAX Maximumvalueforav......
  • C++面试八股文:在C++中,有哪些可执行体?
    某日二师兄参加XXX科技公司的C++工程师开发岗位第14面:面试官:在C++中,有哪些可执行体?二师兄:可执行体?面试官:也就是可调用对象。二师兄:让我想一想。函数、函数指针、类的静态方法、类的成员方法、仿函数、lambda表达式。面试官:能说一说他们之间有什么区别吗?二师兄:好的。函数是......
  • #yyds干货盘点# LeetCode程序员面试金典:分割回文串
    题目:给你一个字符串s,请你将s分割成一些子串,使每个子串都是回文串。返回s所有可能的分割方案。回文串是正着读和反着读都一样的字符串。 示例1:输入:s="aab"输出:[["a","a","b"],["aa","b"]]示例2:输入:s="a"输出:[["a"]]代码实现:classSolution{bo......