概述

       TCMalloc 是 Google 开发的内存分配器,在不少项目中都有使用,例如在 Golang 中就使用了类似的算法进行内存分配。它具有现代化内存分配器的基本特征:对抗内存碎片、在多核处理器能够 scale。据称,它的内存分配速度是 glibc2.3(glibc是GNU发布的libc库,即c运行库。glibc是linux系统中最底层的api,几乎其它任何运行库都会依赖于glibc。glibc除了封装linux操作系统所提供的系统服务外,它本身也提供了许多其它一些必要功能服务的实现)中实现的 malloc的数倍。

  TCMalloc全称Thread-Caching Malloc,即线程缓存的malloc,实现了高效的多线程内存管理,用于替代系统的内存分配相关的函数(malloc、free,new,new[]等)。

  TCMalloc是gperftools的一部分,除TCMalloc外,gperftools还包括heap-checker、heap-profiler和cpu-profiler。本文只讨论gperftools的TCMalloc部分。

  git仓库:https://github.com/gperftools/gperftools.git

  官方介绍:https://gperftools.github.io/gperftools/TCMalloc.html

安装

从git仓库clone版本的gperftools的安装依赖autoconf、automake、libtool,以Mac为例:

  $ brew install autoconf automake libtool

  Autoconf实际上是一个工具集,其中包含aclocal、autoheader和autoconf等可执行文件。Libtool软件包是第三个重要的GNU工具,它的作用是确定共享库在特定平台上的特性。

  $ ./autogen.sh

  生成Makefile

  $ ./configure

  编译

  $ make

  安装

  $ make install

  默认安装在/usr/local/下的相关路径(bin、lib、share),可在configure时以--prefix=PATH指定其他路径。

TCMalloc是如何生效的

  为什么指定-ltcmalloc或者与libtcmalloc_and_profiler.a连接之后,对malloc、free、new、delete等的调用就由默认的libc中的函数调用变为TCMalloc中相应的函数调用了呢?答案在libc_override.h中

  Qt工程中使用tcmalloc,新建工程qtTCmallocTest,pro文件中链接静态库libtcmalloc.a或者动态库libtcmalloc.dylib,我使用Mac平台的clang构建正常,运行也正常,Demo运行截图如下图所示,一切都好!

  

  我使用iOS Simulator构建出现警告错误:

  :-1: warning: URGENT:building for iOS Simulator simulator, but linking against dylib (/usr/local/lib/libtcmalloc.dylib) built for macOS. Note: This will be an error in the future.

实际运行也会有运行时的类似提示导致最终无法在iOS模拟器上运行:

  

  解决办法:重新编译配置

$make uninstall                          // 删除/usr/local/lib下的tcmalloc库

$make clean                              // 清除make产生的临时文件

// 重新configure来配置,只生成minimal的静态库(.a)

$./configure --disable-cpu-profiler --disable-heap-profiler --disable-heap-checker --enable-minimal --enable-static --disable-shared

$make & make install

编译安装成后后

$cd /usr/local/lib

$ls

可见只生成了libtcmalloc_minimal.a和libtcmalloc_minimal_debug.a

查看静态库的架构:

$lipo –info libtcmalloc_minimal.a

可见是x86_64架构的静态库,我们的iOS模拟器是64位处理器,测试需要x86_64架构库,看起来可以使用的。

  现在重新在Qt Creator中使用iOS Simulator构建我们上面的qtTCmallocTest Demo,在pro文件中添加静态库libtcmalloc_minimal.a,编译链接,结果成功构建,运行时却出错了~

  

  错误提示在tcmalloc的源码中,尝试free了已经失效的指针导致出错。可能的原因是程序启动后会调用glibc内存分配的malloc、free等函数,而tcmalloc库就已经将glibc中的内存分配替换成了自己的,此时有点过早调用导致出错。

  解决:注释修改tcmalloc源码相关部分,然后再重新make以及make install

  找到libc_override_osx.h,注释部分代码

  

  

  重新make过程中还会出现如下错误:

  

  可以看到是cfree和pvalloc引用错误,找到tcmalloc_unittest.cc可以看到如下代码:

#if defined(_WIN32)

  # define cfree free         // don't bother to try to test these obsolete fns

  # define valloc malloc

  # define pvalloc malloc

  将该文件中用到cfree的地方用free替代,用到valloc和pvalloc的地方用malloc替代,保存后,再重新make,没啥错误,紧接着make install。

  再次构建Demo,并运行:

  

  注意:手机等嵌入式内存等较小,程序中不宜不断申请内存,可能造成内存不够用导致程序崩溃退出。

  到此为止,使用tcmalloc静态库尝试可以在iOS模拟器上运行了~

  但是我在iOS真机上编译时却提示找不到arm64架构符号的错误:

  

  可见在Mac OS的终端中执行的./configure & make & make install等操作编译出来的静态库和动态库是针对Mac平台的,iOS平台不兼容导致无法使用。

  该文章指出:iOS用不了谷歌的tcmalloc,无语了~

  Compile tcmalloc for iOS,but getting errors进行了Compile tcmalloc for iOS的尝试,但是遇到了错误,看底下评论,这一部分在官网文档中并没有涉及,也希望借此机会来完善tcmalloc对iOS的支持。

  我努力尝试Clang交叉编译iOS真机版本的tcmalloc,最终没有编译出可以正常使用的arm64架构的静态库,目前是个难题,烦请哪位大神给予指导!

尝试在Mac/iOS上使用tcmalloc库的更多相关文章

  1. 关于iOS上的静态库

    最近再进行项目的真机调试,然后发现了一个天坑.就此研究了一些iOS上的静态库的使用: 首先我们是直接拿一个可以运行的项目来制作静态库的,网上大部分都是先创建静态库然后再写内容,看看我的方法. 1.把子 ...

  2. IOS上编译boost库

    环境:xcode9mac os 10.13 1.下载boost库并解压2.cd到解压后的文件包内,执行 sh bootstrap.sh(解压后会得到这个脚本文件).3.执行./b2 编译整个库.4.经 ...

  3. ios 开发中 动态库 与静态库的区别

    使用静态库的好处 1,模块化,分工合作 2,避免少量改动经常导致大量的重复编译连接 3,也可以重用,注意不是共享使用 动态库使用有如下好处: 1使用动态库,可以将最终可执行文件体积缩小 2使用动态库, ...

  4. 【iOS】编译静态库

    与java和.net一样,objc也由类库的概念,不过在在objc上一般叫库,库表示程序代码集合,可以共享给其他程序使用,库是编译后的二进制文件,因此不能看到源代码,多用于一些开放sdk(如百度地图s ...

  5. 最全面的iOS和Mac开源项目和第三方库汇总

    标签: UI 下拉刷新 EGOTableViewPullRefresh – 最早的下拉刷新控件. SVPullToRefresh – 下拉刷新控件. MJRefresh – 仅需一行代码就可以为UIT ...

  6. 尝试在Mac上编译DNX

    自从XRE改名为DNX至今,从来没有在Mac OS X上成功编译过DNX.一直很纳闷,难道DNX的开发人员不用Mac?今天突然明白了,DNX的开发人员真的不用Mac.而且DNX用的2个持续集成服务Ap ...

  7. ios 联网 在mac机器上进行抓包

    Remote Virtual Interface在使用Mac抓取iPhone数据包中介绍了两种方式在Mac电脑上抓取iPhone上的数据包,一是使用Mac的网络共享功能将Mac的网络通过WiFi共享给 ...

  8. 解决protobuf不能直接在IOS上使用,利用protobuf-net在IOS上通讯

    ---------------------------------------------------------------------------------------------------- ...

  9. 在iOS中创建静态库

    如果您有不错的原创或译文,欢迎提交给我们,更欢迎其他朋友加入我们的翻译小组(联系qq:2408167315).  =========================================== ...

随机推荐

  1. JS高阶---闭包应用(自定义JS模块)

    [自定义JS模块] [闭包案例] (1)案例1 对应的模块文件 (2)案例2---使用匿名函数 对应的模块文件 案例2分析:因为内部函数引用了外部函数的变量,且存在嵌套关系,所以是闭包,分析结构图如下 ...

  2. shell-处理用户输入

    命令行参数 #./admin 10 30 读取参数 [root@localhost scrips]# vi test28.sh #!/bin/bashfactorial=1for ((number=1 ...

  3. Photoshop cc 2019 下载链接

    [安装环境]:win7/win8/win10 [64位下载] 百度网盘链接:pan.baidu.com/s/14vwkeez-jAx8WVkXXUgfPQ  提取码:797f

  4. Identity入门1:Claims、ClaimsIdentity、ClaimsPrincipal详解【转】

    在 ASP.NET Core 中,仍然沿用了 ASP.NET里面的 Identity 组件库,负责对用户的身份进行认证,总体来说的话,没有MVC 5 里面那么复杂,因为在MVC 5里面引入了OWIN的 ...

  5. 使用arthas 生成火焰图分析jvm

    arthas 是阿里巴巴开源的强大的jvm 应该分析工具,以下是使用arthas 生成jvm 火焰图的一个学习 项目使用docker-compose 运行,对于生成的火焰图使用nginx 提供一个访问 ...

  6. [LeetCode] 248. Strobogrammatic Number III 对称数之三

    A strobogrammatic number is a number that looks the same when rotated 180 degrees (looked at upside ...

  7. Salesforce 开发整理(十)项目部署总结

    项目部署顺序 全局值集 小组 自定义字段-对象-设置(SF1 紧凑布局要和记录类型在这里要一起部署) 邮件模板-静态资源 角色 工作流-流定义(包含进程生成器) 批准过程 开发部署<Apex类, ...

  8. oracle--DBWN

    一,DBWN功能 将脏数据写盘 二,什么情况下会触发DBWN的进程呢? 1) check pointer:有检查点, 2) 脏数据达到阀值:达到buffer内存的10%即要将脏数据写到磁盘: 这就是造 ...

  9. Java连载12-继承开发环境&long类型

    一.集成开发环境(Integrated Develop Environment,简称IDE) 1.什么是集成开发环境 (1)集成开发环境可以使软件开发变得更简单 (2)没有IDE工具: i.需要安装J ...

  10. linux shell根据端口返回进程号杀死进程的方法

    linux shell根据端口返回进程号杀死进程的方法<pre>kill `lsof -t -i:9501`</pre>这个就是杀死9501端口的进程号