课程咨询: 400-996-5531 / 投诉建议: 400-111-8989
认真做教育 专心促就业
内存的优化是软件运维管理中经常用到的一种优化方法,而今天我们就通过案例分析来了解一下,常见的内存优化方法包含哪些类型。
小对象分配器
C的动态内存分配是介于系统和应用程序的中间层,malloc/free本身体现的就是一种按需分配+复用的思想。
当你调用malloc向glibc的动态内存分配器ptmalloc申请6字节的内存,实际耗费的会大于6字节,6是动态分配块的有效载荷,动态内存分配器会为chunk添加部和尾部,有时候还会加一下填充,所以,真正耗费的存储空间会远大于6字节,在我的机器上,通过malloc_usable_size发现申请6字节,返回的chunk,实际可用的size为24,加上尾部就更多了。
但你真正申请(可用)的大小是6字节,可见,动态内存分配的chunk内有大量的碎片,这就是内碎片,而外碎片是存在chunk之间的,是另一个问题。
当你申请的size较大,有效载荷/耗费空间的比例会比较高,内碎片占比不高,但但size较小,这个占比就高,如果这种小size的chunk非常多,就会造成内存的极大浪费。
内存分配和对象构建分离
c的malloc用来动态分配内存,free用来归还内存;C++的new做了3件事,通过operatornew(本质上等同malloc)分配内存,在分配的内存上构建对象,返回对象指针;而delete干了两件事,调用析构函数,归还内存。
C++通过placementnew可以分离内存分配和对象构建,结合显示的析构函数调用,达到自控的目的。
内存复用
编解码、加解密、序列化反序列化(marshal/unmarshal)的时候一般都需要动态申请内存,这种调用频次很高,可以考虑用静态内存,为了避免多线程竞争,可以用threadlocal。
【免责声明】本文系本网编辑部分转载,转载目的在于传递更多信息,并不代表本网赞同其观点和对其真实性负责。如涉及作品内容、版权和其它问题,请在30日内与管理员联系,我们会予以更改或删除相关文章,以保证您的权益!更多内容请在707945861群中学习了解。