概述

       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. 简单python爬虫实例

    先放上url,https://music.douban.com/chart 这是豆瓣的一个音乐排行榜,这里爬取了左边部分的歌曲排行榜部分,爬虫很简单,就用到了beautifulsoup和request ...

  2. nginx 配置使用index.php作为目录的默认加载文件

    配置如下: 在server增加一行: index index.php index.html index.htm default.php default.htm default.html 增加后如下: ...

  3. LeetCode 79. Word Search单词搜索 (C++)

    题目: Given a 2D board and a word, find if the word exists in the grid. The word can be constructed fr ...

  4. 微信小程序音频背景播放

    由于微信小程序官方将音频的样式固定死了,往往再工作中和UI设计师设计出来的样式不符,故一般都采用背景音频播放来实现自定义的UI样式的音频播放,即使用官网API提供的BackgroundAudioMan ...

  5. icon发展史速览

    icon 发展史 img 多张图片占用多个请求,想办法减少请求,合并图片,image sprite background-position /* 使用background-position来定位图标 ...

  6. MySQL实战45讲学习笔记:第二十八讲

    一.读写分离架构 在上一篇文章中,我和你介绍了一主多从的结构以及切换流程.今天我们就继续聊聊一主多从架构的应用场景:读写分离,以及怎么处理主备延迟导致的读写分离问题. 我们在上一篇文章中提到的一主多从 ...

  7. TextView实现文字水平滚动效果

    有时候我们使用TextView显示文本,只想把所有内容用一行显示出来,但是一行又显示不完,就需要让文本实现水平滚动的效果. 具体实现方法如下: 1,实现自定义TextView并实现isFocused( ...

  8. 2019年上-C语言程序设计课程内容

    第一节课 序言 为何学习C语言 打印hello world程序 编译步骤,认识编译器 冯诺依曼体系结构 hello world程序如何在计算机上运行的 第二节课 基本数据类型与表达式 求华氏温度对应的 ...

  9. CentOS7 配置ip地址

    1.查看网络配置文件 可能因为不同的系统,配置文件都不一样,总体来说,配置文件都是 前缀:ifcfg-eno + 后缀:随机数组成 进入到 /etc/sysconfig/network-scripts ...

  10. 下载工具系列——Aria2 (几乎全能的下载神器)

    一.介绍 说完了前面一堆BT/PT客户端,现在终于轮到Aria2了,关于这个我就不介绍太多了,自从百度限速以来我觉得这个快变成众所周知的了,我平时也收集了各种和Aria2相关的插件或者是辅助软件之类的 ...