尝试在Mac/iOS上使用tcmalloc库
概述
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库的更多相关文章
- 关于iOS上的静态库
最近再进行项目的真机调试,然后发现了一个天坑.就此研究了一些iOS上的静态库的使用: 首先我们是直接拿一个可以运行的项目来制作静态库的,网上大部分都是先创建静态库然后再写内容,看看我的方法. 1.把子 ...
- IOS上编译boost库
环境:xcode9mac os 10.13 1.下载boost库并解压2.cd到解压后的文件包内,执行 sh bootstrap.sh(解压后会得到这个脚本文件).3.执行./b2 编译整个库.4.经 ...
- ios 开发中 动态库 与静态库的区别
使用静态库的好处 1,模块化,分工合作 2,避免少量改动经常导致大量的重复编译连接 3,也可以重用,注意不是共享使用 动态库使用有如下好处: 1使用动态库,可以将最终可执行文件体积缩小 2使用动态库, ...
- 【iOS】编译静态库
与java和.net一样,objc也由类库的概念,不过在在objc上一般叫库,库表示程序代码集合,可以共享给其他程序使用,库是编译后的二进制文件,因此不能看到源代码,多用于一些开放sdk(如百度地图s ...
- 最全面的iOS和Mac开源项目和第三方库汇总
标签: UI 下拉刷新 EGOTableViewPullRefresh – 最早的下拉刷新控件. SVPullToRefresh – 下拉刷新控件. MJRefresh – 仅需一行代码就可以为UIT ...
- 尝试在Mac上编译DNX
自从XRE改名为DNX至今,从来没有在Mac OS X上成功编译过DNX.一直很纳闷,难道DNX的开发人员不用Mac?今天突然明白了,DNX的开发人员真的不用Mac.而且DNX用的2个持续集成服务Ap ...
- ios 联网 在mac机器上进行抓包
Remote Virtual Interface在使用Mac抓取iPhone数据包中介绍了两种方式在Mac电脑上抓取iPhone上的数据包,一是使用Mac的网络共享功能将Mac的网络通过WiFi共享给 ...
- 解决protobuf不能直接在IOS上使用,利用protobuf-net在IOS上通讯
---------------------------------------------------------------------------------------------------- ...
- 在iOS中创建静态库
如果您有不错的原创或译文,欢迎提交给我们,更欢迎其他朋友加入我们的翻译小组(联系qq:2408167315). =========================================== ...
随机推荐
- UiPath:Delay延迟执行,解决UiPath自动输入值不完整问题
学习过程中出现点击按钮后,由于网页弹出框显示速度慢,造成输入值遗漏或者根本就没有输入问题. 查阅了一下,目前解决方法是在点击按钮后加一段延迟时间,等待他显示完整在输入值.如图 时间格式以秒为单位 00 ...
- 【Spring Data JPA篇】项目环境搭建(一)
项目环境: spring4.1.6 hibernate4.3.11 spring-data-jpa1.9.0 1. 创建一个Java Project,将jar导入到lib目录下 #spring spr ...
- npm安装使用^符号时,在0.0.1等版本下区别
文档地址 https://docs.npmjs.com/misc/semver Caret Ranges ^1.2.3 ^0.2.5 ^0.0.4§ Allows changes that do no ...
- Educational Codeforces Round 61 (Rated for Div. 2) E 多重背包优化
https://codeforces.com/contest/1132/problem/E 题意 有8种物品,重量是1~8,每种数量是\(cnt[i]\)(1e16),问容量为W(1e18)的背包最多 ...
- Web协议详解与抓包实战:HTTP1协议-HTTP 响应行(3)
一.HTTP 响应行 二.响应码分类:1xx 三.响应码分类: 2xx 1. 201 Created: 有新资源在服务器端被成功创建 2.207 Multi-Status:RFC4918 ,在 WEB ...
- python 利用淘宝IP库 查询IP归属地
#coding:utf-8 from django.test import TestCase import json import urllib ip = "114.114.114.114& ...
- ZROI1153 【线上训练3】数个数
ZROI1153 [线上训练3]数个数 传送门 一道非常有意思的题,涵盖了各种知识点. 首先,很显然,这是个容斥.容斥可以过掉\(30pts\). 这里我们考虑容斥+DP. 我们令\(dp[i][j] ...
- 使用WCF-SQL一次Insert多个表
在Visual Studio中新增生成项目 选择适配器类型 选择WCF-SQL适配器 创建连接选项 选择相应的存储过程 生成相应的消息架构
- VisualHull && association4D 观摩记录
简单记录一下自己对VisualHull 和 association4D 两个程序的理解,没有别的意思(当然是真的 由于进度还很慢,暂时只是简单记录一下发现的点和踩过的坑,做完再把资料汇总. Visua ...
- nohup 启动后台应用
nohup java -Xmx1024M -Xms1024M -jar app.jar --logging.level=warn --logging.path=/var/log/app--server ...